2010-09-07 2 views
0

В настоящее время я создаю скрипт, который позволит пользователю загружать файл по URL-адресу без фактического просмотра имени файла или файла, где он хранится. Пока у меня все построено, но мне нужно знать, как я буду обращаться к файлу для открытия и загрузки. В настоящее время у меня рабочая версия (код ниже), но по какой-то причине PHP развращает загрузку. Каждый раз, когда я пытаюсь открыть файл, который загружается на мой рабочий стол, я получаю сообщение об ошибке. Когда я открываю тот же самый файл на самом сервере, файл работает отлично.PHP File Download

Структура URL:
http://www.example.com/download/file/cjVQv0ng0zr2

код, который инициирует загрузку

$fullpath = BASE_PATH . '../uploads/brochures/' . $vendors['0']['filename']; 

    header("Content-type: application/pdf"); 
    header('Content-disposition: attachment; filename="' . $fullpath . '"'); 

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

Спасибо заранее, Джейк

ответ

2

Вы должны вызвать следующую строку после отправки заголовка.

readfile($fullpath); 

, а также настроить в заголовке, как это:

header('Content-disposition: attachment; filename="' . basename($fullpath) . '"'); 

Одна вещь я не уверен, что это $ FULLPATH .. попытаться увидеть, если $ FULLPATH у вас есть правильно, и вы можете на самом деле дойти до файла, это должен быть полный физический путь к файлу.

Я думаю, что это также может быть хорошей идеей, чтобы добавить следующий заголовок, а также:

header("Content-Transfer-Encoding: binary"); 
+0

Спасибо за ответ так быстро. Я изменил сценарий, чтобы включить то, что вы упомянули, но я все еще получаю следующую ошибку: произошла ошибка при открытии этого документа. Файл поврежден и не может быть восстановлен. – Jake

+0

, чтобы убедиться, что ваш физический путь верен, просто оберните код внутри if (is_file ($ fullpath)) {} –

+0

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

0

У меня была аналогичная проблема некоторое время назад. Убедитесь, что у вас нет лишних пробелов в файле сценария, либо перед тегом "<?php", либо после тега "?>". В моем случае последний символ моего скрипта был "\n" вместо ожидаемого ">".

0

Я столкнулся с той же проблемой, когда-то назад, после работы для меня; положить

while(@ob_end_clean()); 

непосредственно перед функциями заголовка:

header("Content-Type: ". $row['p_mime']); 
header("Content-Length: ". $row['p_size']); 
header("Content-Disposition: inline; filename=".$row["p_name"]); 

Content-диспозиция: прикрепление/рядный должен быть установлен в соответствии со случаями (1 строки для загрузки/2. открыть в браузере)

ПРИМЕЧАНИЕ: следите за тем, чтобы вы не повторяли и не оценивали перед функцией заголовка, а чрезмерная осторожность не причинит никакого вреда, отключите все функции перед функцией заголовка, которые, по вашему мнению, не удастся, или порождают предупреждение, префикс «@», символ для этих строк php-кода.

все самое лучшее :)

+0

кто-нибудь! просветите меня! почему я проголосовал? –

+0

Просто попробовал это решение, и он отлично работал для меня. Благодарю. – DaveE

0

Удостоверьтесь, что вы выходите ...

(я использую блоб)

header("Content-Type: " . $response['content_type']); 
header("Cache-Control: maxage=1"); 
header("Pragma: public"); //fixes ie bug 
echo trim($_data); 
exit();