Я хочу скрыть местоположение папки для загрузки, чтобы, когда пользователь загружает файл, он не может видеть местоположение. Я думаю, что это можно сделать, используя файл .htaccess, но как это сделать? Альтернативно, как это можно сделать с PHP?
Как скрыть фактическое местоположение папки загрузки
Ответ 1
Вот как я это делаю в PHP:
<?php
$fakeFileName= "fakeFileName.zip";
$realFileName = "realFileName.zip";
$file = "downloadFolder/".$realFileName;
$fp = fopen($file, 'rb');
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=$fakeFileName");
header("Content-Length: " . filesize($file));
fpassthru($fp);
?>
Кроме того, если вы не хотите, чтобы кто-либо имел доступ к местоположению файла, поместите файл с именем .htaccess
в папку загрузки только с содержимым:
deny from all
Я немного изменил код. Во-первых, когда я говорю об имени поддельного файла и имени реального файла, поддельное имя файла - это имя, которое загрузчик будет загружать в файл, где фактическое имя файла - это имя фактического файла в папке загрузки на вашем сервере.
Кроме того, я проверяю, что пользователь вошел в систему и может загрузить файл. Если он захочет загрузить файл, PHP файл вызывается на новой вкладке (с кодом загрузки сверху), а затем в конце файла у меня есть строка:
exit;
Поэтому, когда он нажимает на ссылку для загрузки, быстро появляется страница на новой вкладке, затем быстро выходит и начинается загрузка.
EDIT: Ссылка на скачивание выглядит примерно так:
<a href="simpleDown.php?id=<?php echo $_GET['id']; ?>" target="_blank">Download!</a>
Где id
- это id
загрузки в базе данных, а в загрузке script сверху я нахожу запись с этим id
, а затем получаю ее реальное имя файла и имя поддельного файла. Вы можете сделать это без базы данных.
Ответ 2
Возможно, вы захотите изучить либо Mod Rewrite, либо использовать свой PHP script, чтобы иметь возможность доступа к файлу, просто перейдя в file.php?f=someHash
, а затем используя поток октета, чтобы заставить пользователя загружать файл.
Ответ 3
То, что вам нужно сделать, - это направить пользователя на fake_url.php
, а затем переписать этот URL в другой файл - real_url.php
. Это эффективно отображает real_url.php
как скрытое, поскольку пользователь не знает о переадресации в вашем файле .htaccess
.
RewriteRule fake_url.php(.*)$ real_url.php?$1 [L,QSA]
В вашем real_url.php
вы можете прочитать параметры, переданные через перенаправление, а затем использовать что-то похожее на readFile()
, чтобы отправить соответствующий файл обратно пользователю из real_url.php
Таким образом, пользователь увидит только URL-адрес - https://my-secret-site/download.php?file=file_to_download
И в вашем real_url.php
вы узнаете, какой файл был запрошен, проверив параметр $_GET['file']
.
Фактическое местоположение файлов, которые пользователь загружает, уже не имеет значения. Все загрузки идут, хотя fake_url.php
и только то, что script должно знать реальное местоположение папки для загрузки.
Ответ 4
Я думаю, основная часть - "писать в .htaccess", что может быть сделано просто fwrite, но это решение не будет работать, если вы даете пользователю выбор онлайн-чтения PDF файла, потому что в этом случае требуется сокет чтобы открыть больше времени (так или иначе, если вы это сделаете, это может поставить под угрозу вашу безопасность!),
<?php
session_start();
$fileLocation = getenv("DOCUMENT_ROOT") . "your_download _folder/.htaccess";
$file = fopen($fileLocation,"w");
$k="\.(md|htaccess)$";
$content = "IndexIgnore *
Order Deny,Allow
Deny from All
AddType application/octet-stream .pdf";
fwrite($file,$content);
fclose($file);
$p=getenv("DOCUMENT_ROOT") . "your_download _folder/".$_SESSION['x'](file_to_be_downloaded !);
header("Content-type:application/pdf");
header("Content-Disposition:attachment;filename=".$_SESSION['x']);
readfile($p);
$fileLocation = getenv("DOCUMENT_ROOT") . "your_download _folder/.htaccess";
$file = fopen($fileLocation,"w");
$k="\.(md|htaccess)$";
$content = "IndexIgnore *
Order Allow,Deny
Deny from All
AddType application/octet-stream .pdf";
fwrite($file,$content);
fclose($file);
exit;
?>
Результат: в следующем окне (которое будет закрыто в следующий момент) пользователю будет загружен параметр загрузки файла.