PHP readfile () добавление дополнительных байтов в загруженный файл

Я пытаюсь устранить проблему, которую я испытываю при загрузке «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;