сообщение «нет файлов для извлечения» при попытке извлечь zip-файл, который был загружен принудительно - PullRequest
1 голос
/ 15 февраля 2011

Когда я пытаюсь извлечь папку zip, которую я принудительно скачал с сервера, я получаю сообщение «нет файлов для извлечения».Но когда я загружаю папку zip прямо с сервера, я могу извлечь ее правильно.Вот код, который я использовал для принудительной загрузки.

$file = 'absolute/path/to/the/zip/folder';
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Content-Type: application/force-download");
header( "Content-Disposition: attachment; filename=".basename($file));
header( "Content-Description: File Transfer");
@readfile($file); 

Кто-нибудь знает, почему это происходит?Любая помощь будет оценена.Заранее спасибо

Ответы [ 3 ]

1 голос
/ 15 февраля 2011

Я не могу ответить на вопрос, но вот несколько идей, которые стоит попробовать:

  • Попробуйте другой mimetype, например, общий application/octet-stream.
  • Присоедините Fiddler (или любой другой HTTP-отладчик) и посмотрите на передачу. Что ты видишь? Файл загружается? Может быть, по какой-то причине недопустимый заголовок Content-Length?
  • Как отмечает @middaparka в комментариях, не подавляйте ошибки из readfile().
0 голосов
/ 16 февраля 2011

Спасибо всем за вашу поддержку.Я нашел решение.Я использовал функцию mkdir перед отправкой заголовков.Кажется, это приводило к некоторой ошибке, поэтому ошибка выводилась перед заголовками и, таким образом, вызывала проблему.Когда я подавил ошибки с помощью оператора '@', проблема была решена.:).Ранее я получил следующее сообщение от fiddler: «Fiddler обнаружил нарушение протокола в сеансе № 4. Сервер не возвратил правильно отформатированные заголовки HTTP. Может отсутствовать вообще (например, HTTP / 0.9), возможно, только \ r \ r вместо\ г \ п \ г \ п? "

0 голосов
/ 15 февраля 2011

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

header("Cache-Control: private");
header("Content-Type: application/stream");
header("Content-Length: ".filesize($file));
header("Content-Disposition: attachment; filename=".basename($file));

readfile($file);
exit();

Таким образом, вы можете попробовать описанное выше и посмотреть, если это имеет какое-либо значение.(Можно предположить, что если ваше соединение медленное, тот факт, что вы не предоставляете заголовок Content-Length, может не помочь ситуации.)

...