Я пытаюсь устранить проблему, которую я испытываю при загрузке «zip-файла» из php-скрипта. Похоже, что когда я загружаю файл, используя следующий код, загруженный файл имеет дополнительный 0A09, добавленный к началу файла, что приводит к тому, что winzip выдает ошибку коррупции.
<?php $pagePermissions = 7; require_once ('util/check.php'); require_once ('util/file_manager.php'); $file_manager = new FileManager(); if ($_SERVER['REQUEST_METHOD'] == "GET") { if (isset($_GET['q']) && $_GET['q'] == 'logout') { //require_once ('util/users.php'); //$userdata = new Userdata(); $userdata -> kill_session(); header("Location: download.php"); exit ; } if (isset($_GET['q']) && $_GET['q'] == 'fetch') { if (isset($_GET['name'])) { @apache_setenv('no-gzip', 1); header("Content-length: " . filesize('upload/' . $_GET['name'])); header('Content-type: application/zip'); //header("Content-Disposition: attachment; filename=\"{$_GET['name']}\" "); header("Content-Disposition: attachment; filename={$_GET['name']}"); header('Content-Transfer-Encoding: binary'); readfile('upload/' . $_GET['name']); exit(); } } } ?>
Любая помощь будет принята с благодарностью, загрузка файлов через прямую ссылку, добавленные 2 байта в начало файла происходит только для этого кода. заранее спасибо
Удалить последнее ?>
И проверить, что ваш тег открытия находится на самой первой строке, на самом первом символе ваших скриптов. PHP-файлы не должны заканчиваться конечными тегами. Причина, по которой ваши загруженные файлы содержат (или больше) \r\n
заключается в том, что PHP будет напрямую выводить (выводить) что-либо за пределами <?php ?>
. Обычно, если сценарий не отражает HTML, вы опускаете закрывающий тег PHP, поскольку он не является обязательным, и IMO дает больше проблем, чем что-либо еще.
** Изменить **
Если вы читаете руководство PHP для readfile
, у вас есть полезный пример, в значительной степени код, который у вас есть в вашем вопросе, менее двух строк кода:
@apache_setenv('no-gzip', 1); header("Content-length: " . filesize('upload/' . $_GET['name'])); header('Content-type: application/zip'); //header("Content-Disposition: attachment; filename=\"{$_GET['name']}\" "); header("Content-Disposition: attachment; filename={$_GET['name']}"); header('Content-Transfer-Encoding: binary'); // add these two lines ob_clean(); // discard any data in the output buffer (if possible) flush(); // flush headers (if possible) readfile('upload/' . $_GET['name']); exit();
Если после этого у вас все еще есть проблемы, проблема может быть не в вашем PHP-коде.
Извините за поздний ответ…..
я не знаю, что я прав, пока вы не проголосуете за это …..
отредактируйте свой код как:
ob_start(""); //instead of ob_start(); with out a null callback
а также
ob_end_clean(); //at the end , Note : "important" add instead of ob_end_flush()
то есть;
ob_start(""); //header ob_end_clean();
Сегодня я столкнулся с подобной проблемой, связанной с readfile (). Оказывается, у моего php.ini-файла есть выходное сжатие, и это испортило флеш-модуль, пытающийся извлечь файл. (Я думаю, он не мог справиться с этим.)
Все, что мне нужно было сделать, это отключить сжатие в файле php.ini:
zlib.output_compression = off
Или, альтернативно, в вашем скрипте:
<?php ini_set('zlib.output_compression', 'Off'); ?>
Просто хочу поделиться этим, если у кого-то возникли проблемы с получением файлов из файла readfile ().
У меня была аналогичная проблема в Joomla (2.5), используя readfile для передачи файлов Excel (.xls) пользователю.
Я также заметил, что в текстовых и xml-файлах был вставлен некоторый код в начале, но почти игнорировался, потому что xml и текстовые устройства, как правило, открывали файлы.
Я решил попробовать предложения Яника (а не играть с параметрами сжатия сервера), просто промывая буфер перед readfile:
ob_clean(); // discard any data in the output buffer (if possible) flush(); // flush headers (if possible)
Эй, престо, это сработало. Я предлагаю это в качестве альтернативного ответа: выделить основную причину, показать, что он может исправить проблему Joomla и потому, что у меня была смесь двоичных и текстовых возвратов.
Просто добавьте (извините, если это очевидно!) – настройка типа mime работала нормально:
$document = JFactory::getDocument(); $document->setMimeEncoding($mimetype);
Мне даже не нужно было устанавливать «Content-Transfer-Encoding: binary», когда тип mime был для application / octet-stream.
У меня была такая же проблема. Поэтому я использовал эти заголовки, и я получил свое решение.
$filename = ABSPATH.'/wp-content/summary/user_content/'.trim($file); header('Pragma: public'); header('Expires: 0'); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Content-Description: File Transfer'); header('Content-Type: text/text'); header('Content-Disposition: attachment; filename="'.$file.'"'); header('Content-Transfer-Encoding: binary'); header('Cache-Control: max-age=0'); readfile($filename); exit;