Я хочу скрыть местоположение папки для загрузки, поэтому, когда пользователь загружает файл, он не может видеть местоположение. для этого я думаю, что это можно сделать с помощью .htaccess, но как это сделать? и можем ли мы сделать это с помощью php? если мы сможем тогда, как это сделать?
Вот как я это делаю в 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
загрузки в базе данных, а в скрипте загрузки сверху я нахожу запись с этим id
, а затем получаю ее реальное имя файла и имя поддельного файла. Вы можете сделать это без базы данных.
Возможно, вы захотите изучить либо Mod Rewrite, либо использовать свой PHP-скрипт, чтобы иметь возможность доступа к файлу, просто перейдя в file.php?f=someHash
а затем используя поток октетов, чтобы заставить пользователя загружать файл.
То, что вы собираетесь сделать, – это направить пользователя на 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
вы узнаете, какой файл был запрошен, real_url.php
параметр $_GET['file']
.
Фактическое местоположение файлов, которые загружается пользователем, уже не имеет значения. Все загрузки идут через fake_url.php
и только этот скрипт должен знать реальное местоположение папки для загрузки.
Я думаю, основная часть – «писать в .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; ?>
Результат: в следующем окне (которое будет закрыто в следующий момент) пользователю будет предложена опция загрузки файла.