2012-01-31 2 views
1

У меня есть файл excel, который я хочу, чтобы пользователь мог загружать с моего сервера. Я рассмотрел множество вопросов здесь, но я не могу найти способ правильно загрузить файл без коррупции. Я предполагаю, что это заголовки, но пока у меня не было рабочего сочетания. Это то, что у меня есть прямо сейчас, и в поврежденном файле, который я получаю, я могу увидеть имена столбцов, которые мне нужны, но все это испортилось.PHP, загружающий файл excel, становится поврежденным

$filename = '/var/www/web1/web/public/temporary/Spreadsheet.xls';   
header("Content-type: application/octet-stream"); 
header("Content-type: application/vnd-ms-excel"); 
header("Content-Disposition: attachment; filename=ExcelFile.xls;"); 
header("Pragma: no-cache"); 
header("Expires: 0"); 
readfile($filename); 

редактировать: Решение Я забыл добавить, что я использую Zend и это развращает файлы при попытке использовать собственные методы PHP. Мой finsihed код был разместить ссылку на другое действие в мой контроллер и есть файлы скачать оттуда

public function downloadAction(){ 
     $file = '/var/www/web1/web/public/temporary/Spreadsheet.xls'; 
     header('Content-Type: application/vnd.ms-excel'); 
    header('Content-Disposition: attachment; filename="Spreadsheet.xls"'); 
    readfile($file); 

    // disable the view ... and perhaps the layout 
    $this->view->layout()->disableLayout(); 
     $this->_helper->viewRenderer->setNoRender(true); 


    } 
+0

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

+1

вывод 2 заголовков содержимого бессмыслен - файл не может быть сразу двумя. это как сказать: «Я жираф и кит!». –

+1

Долгий, длинный путь наиболее распространенным ответом на такие вопросы сводится к следующему: а) у вас есть ведущие/конечные пробелы/HTML до/после тегов '' в вашем скрипте или спецификации в вашем файл или b) вы забыли вызывать 'exit' /' die' после 'readfile()', и больше содержимого было выведено в конце ваших файлов. – DaveRandom

ответ

5

пытаются делать это таким образом

ob_get_clean(); 
echo file_get_contents($filename); 
ob_end_flush(); 
+0

Да, скрипт php добавлял некоторые пробелы в начале и файлы изображений были повреждены при загрузке, ob_get_clean() исправил это. благодаря! –

+0

Я получаю сообщение об ошибке как ob_end_flush(): не удалось удалить и сбросить буфер. Нет буфера для удаления или сброса в file_path.Пожалуйста, предложите мне, что делать @Melvin Protacio – lalithkumar

1

Для одного только указать Content-Type один раз. Вы можете использовать excel-specific header, но общий application/octet-stream может быть более безопасным, только чтобы заставить его работать (реальная разница будет в том, что браузер показывает пользователю в отношении «что бы вы хотели открыть этот файл с», но основные браузеры могут полагайтесь также на расширение)

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

Таким образом, весь файл должен состоять из:

<?php 
    $filename = '/var/www/web1/web/public/temporary/Spreadsheet.xls'; 

    header("Content-Disposition: attachment; filename=ExcelFile.xls;"); 
    header('Content-Type: application/octet-stream'); 
    header('Content-Length: ' . filesize($filename)); 
    header("Pragma: no-cache"); 
    header("Expires: 0"); 

    @readfile($filename); 
+0

Я использовал и ocetet-поток, и оба возвращали то же самое. Я отсутствовал и выходил из оператора, но файл все еще поврежден. – tiggles

+0

@user: Чтобы подтвердить, файл (при загрузке с помощью FTP-клиента) работает нормально? Это только когда вы пытаетесь передать его через PHP в качестве загружаемого файла, который он развращает? –

+0

Да, я загрузил его, хотя ftp проверял, и он отлично работает. Я также использую zend, если это проблема. – tiggles

1
$file_name = "file.xlsx"; 

// first, get MIME information from the file 
$finfo = finfo_open(FILEINFO_MIME_TYPE); 
$mime = finfo_file($finfo, $file_name); 
finfo_close($finfo); 

// send header information to browser 
header('Content-Type: '.$mime); 
header('Content-Disposition: attachment; filename="download_file_name.xlsx"'); 
header('Content-Length: ' . filesize($file_name)); 
header('Expires: 0'); 
header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 

//stream file 
ob_get_clean(); 
echo file_get_contents($file_name); 
ob_end_flush(); 
+0

Как получить функцию finfo_open? Мне нужно скачать любой файл, если да, пожалуйста, поделитесь ссылкой? @Bhavesh Gangani – lalithkumar

+0

@lalithkumar 'finfo_' функции встроены в' PHP> = 5.3.0' –

+1

oh mine - проблема с версией. Спасибо вам @Bhavesh Gangani – lalithkumar