2014-08-28 2 views
0

У меня есть html-файл, который позволяет пользователю отправить файл, чтобы отправить файл на мой скрипт PHP 'upload_file.php'.Файл, загруженный с PHP-скрипта, отличается от файла на сервере

index.html:

<html> 
<body>  
    <form action="upload_file.php" method="post" enctype="multipart/form-data"> 
     <label for="file">Filename:</label> 
     <input type="file" name="file" id="file"><br> 
     <input type="submit" name="submit" value="Submit"> 
    </form>  
</body> 
</html> 

upload_file.php ссылки выше занимает в файле, делает какую-то работу, и выкладывает файл XLSX (используя PHPExcel). После создания объекта PHPExcel, это то, как я пишу его на сервер, а затем заставить пользователя загрузить:

// Save Excel 2007 file 
$objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel); 
$fileBase = explode(".",$_FILES['file']['name']); 
$outFilename = $fileBase[0] . date('His') . ".xlsx"; 
$objWriter->save($outFilename); 
$url = "http://localhost/QWDATA/$outFilename"; 
//Initiate user download of file 
header("Content-Type: application/octet-stream"); 
header("Content-Transfer-Encoding: Binary"); 
header("Content-disposition: attachment; filename=\"$outFilename\""); 
echo readfile($url); 

Когда я делаю это, загрузка успешно инициирована ... с одним вопросом:

Открытие файла, загружаемый приводит к ошибке в Excel:.

«мы обнаружили проблему с некоторым содержанием в $ файла вы хотите, чтобы мы попытки восстановить столько, сколько мы можем Если вы доверяете? источник этой книги , нажмите «Да».

Нажатие «да» на ошибке excel приводит к открытию файла «восстановленного» xlsx и выглядит точно так, как можно было бы ожидать. Глядя на журнал ремонтов, которые были сделаны дает мне это:

error129480_02.xmlErrors были обнаружены в файле «C: \ XPATHX \ $ filename.xlsx'Excel проверки и ремонта завершено на уровне файлов. Некоторые части этой книги , возможно, были отремонтированы или отброшены.

... то есть ничего конкретного.

Отслеживание проблемы назад, открытие файла непосредственно с сервера НЕ приводит к этой ошибке; сообщая мне, что в приведенном выше коде загрузки происходит что-то еще.

Мой вопрос: что может быть причиной этого и/или как я могу решить проблему?

ответ

4

readfile эхо само по себе. Вам не нужно вызывать эхо.

Фактически, делая это, будет эхо результат файла readfile (который является размером файла как целого), поэтому в конце файла создается несколько дополнительных байтов. Это будет легко для Excel исправить, и, вероятно, не приведет к фактической потери данных, но все же файл недействителен, поэтому вы получите ошибку.

0

Рассматривая файл на сервере и файл, который загружается, я заметил разницу в 5 байт.

Уже удалены все прочие echo команды из файла PHP из-за предложения здесь (https://phpexcel.codeplex.com/discussions/42854) и здесь (PHPExcel File format or extension is not valid) Я знал, что что-то пришлось добавлять информацию.

В приведенном выше коде я внес следующие изменения: извлечение экранированных кавычек в имени файла (только личная догадка) в настройке заголовка и изменение эха в readfile (как предлагается здесь: http://webdesign.about.com/od/php/ht/force_download.htm).Таким образом, давая мне:

// Save Excel 2007 file 
$objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel); 
$fileBase = explode(".",$_FILES['file']['name']); 
$outFilename = $fileBase[0] . date('His') . ".xlsx"; 
$objWriter->save($outFilename); 
$url = "http://localhost/QWDATA/$outFilename"; 
//Initiate user download of file 
header("Content-disposition: attachment; filename=$outFilename"); 
header("Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); 
header("Content-Transfer-Encoding: Binary"); 
readfile($outFilename); 

Это, как представляется, непосредственно скачать файл без каких-либо добавок - это значит, первенствует счастлив и проблема решена.

Короче говоря, по-видимому echo readfile($outFilename); нужно просто быть readfile($outFilename);

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