2013-11-24 5 views
0

У меня возникли проблемы с загрузкой файла из хэшированного пути к файлу.Php download from hashed pathfile

Я использую базу данных MySQL, где храню различные данные из HTML-формы. Можно загрузить до трех разных файлов. Они перемещаются в папку uploads на сервере. Я использую MD5 для предотвращения дублирования загрузки файлов.

Все данные в базе данных вызываются из другого сценария. В зависимости от того, сколько файлов загружено, отображается количество загружаемых ссылок. Im, используя fileinfo и заголовки, чтобы определить тип mimetype и загрузить файл. Но все, что я получаю при загрузке, - это некоторый zip-файл со случайными папками и документами или файл без расширения, который, предоставляя правильное расширение, открывается с предупреждениями и в конечном итоге показывает правильный файл.

Вот моя скачать код:

$finfo = finfo_open(FILEINFO_MIME_TYPE); // return mime type ala mimetype extension 
    print("</br>"); echo finfo_file($finfo, $_GET["fName"]); 

    header("Cache-Control: public"); 
    header("Content-Description: File Transfer"); 
    header("Content-Disposition: attachment; filename= ". $_GET["fName"]); 
    header("Content-Type: " .$finfo); 
    finfo_close($finfo); 
    header("Content-Transfer-Encoding: binary"); 

    // Read the file from disk 
     readfile($_GET["fName"]); 

$_GET["fName"] переменная передается по ссылке, которая содержит указанный путь к файлу (например: ./uploads/hashcode). Как я могу сделать это, чтобы я мог правильно загрузить документ? Как и при загрузке документа целиком, а не какой-либо ZIP-файл или файл без расширения.

Я уже несколько дней сражаюсь с этой проблемой (ищется в Интернете, чтобы найти что-то пригодное для использования), и им становится довольно отчаянно.

Дополнительное примечание. В большинстве случаев файл, который загружает, является правильным файлом с моего сервера. Он имеет то же имя, что и хэш-файлы в папке uploads. Но он не имеет никакого расширения.

+0

Вы устанавливаете имя загруженного файла здесь заголовка (. "Content-Disposition: привязанностью, имя файла =" $ _GET [ "имя_файла"]); Возможно, вы могли бы использовать базовое имя или какую-то другую функцию, чтобы правильно присвоить свой файл. – Jompper

+0

Также это не очень безопасно. Если кто-то назвал script.php? FName = script.php или что-то еще, они смогут загружать ваши файлы конфигураций и все, что было сохранено на вашем сервере, – Jompper

+0

Я знаю, что это не один из самых безопасных способов. Я просто хочу, чтобы эта проблема с загрузкой была выполнена до того, как я перейду в режим безопасности. – Amacoder

ответ

1

Скажем, $ _GET [ "имя_файла"] является /uploads/randomhash/ABCDEFABCDEFABCDEF.zip

header("Content-Disposition: attachment; filename= ". basename($_GET["fName"])); 

Это позволит сделать сервер назвать загружаемый файл как ABCDEFABCDEFABCDEF.zip

Если вы сохранили ваши файлы без расширения, тогда у вас может быть проблема. Если у вас есть оригинальное имя файла, сохраненное в базе данных, возможно, вы можете добавить дополнительные $ _GET ['orginalFilename'] к своим ссылкам и использовать его для создания правильного имени файла с расширением.

Также вы устанавливаете заголовки. Они не устанавливаются правильно, если вы выводите что-либо перед ними. Здесь вы печатаете и finfo_file. Вы не должны этого делать.

Я думаю, вы хотите что-то подобное, но вам нужно выяснить, как получить правильное имя файла в filename = part в заголовке.

$finfo = finfo_open(FILEINFO_MIME_TYPE); // return mime type ala mimetype extension 

header("Cache-Control: public"); 
header("Content-Description: File Transfer"); 
header("Content-Disposition: attachment; filename= ". basename($_GET["fName"])); 
header("Content-Type: " . finfo_file($finfo, $_GET["fName"])); 
finfo_close($finfo); 
header("Content-Transfer-Encoding: binary");*/ 

// Read the file from disk 
readfile($_GET["fName"]); 
+0

Хорошо, я изменю заголовки. Но как я могу изменить «Content-type» на правильный мим, если его выше finfo_open? Спасибо за помощь. Я довольно новичок в fileinfo и mimes. – Amacoder

+0

Вы можете использовать finfo_open, вы просто не можете эхо finfo_file ($ finfo, $ _GET ["fName"]); – Jompper

+0

Хорошо. Эхо было больше использовано для проверки причин.Забыл удалить его. Спасибо, что указали на это. – Amacoder

 Смежные вопросы

  • Нет связанных вопросов^_^