Проблема с загрузкой файла на PHP с размещением содержимого: вложение


На моей веб-странице есть ссылка для загрузки CSV-файла, который я сгенерировал на сервере. Код для загрузки выглядит следующим образом:

//open/save dialog box
header('Content-Disposition: attachment; filename="inventoryData.csv"');
//content type
header('Content-type: application/excel');
//read from server and write to buffer
readfile('spreadsheet/inventory.csv');

Когда я открываю файл на сервере, он выглядит просто отлично. Однако, когда я загружаю файл через диалоговое окно, он предварительно ожидает HTML-код для веб-страницы в файл .csv.

Есть идеи, почему это могло произойти?

Author: scott80109, 2012-06-08

3 answers

Если этот код находится в действии контроллера, которое я предполагаю, поскольку вы используете ZF, то вам нужно отключить макет и средство визуализации представления, поскольку оно попытается отобразить представление.

Попробуйте:

public function downloadAction()
{
    $this->_helper->layout()->disableLayout();
    $this->_helper->viewRenderer->setNoRender(true);

    //...

    //open/save dialog box
    header('Content-Disposition: attachment; filename="inventoryData.csv"');
    //content type
    header('Content-type: application/excel');
    //read from server and write to buffer
    readfile('spreadsheet/inventory.csv');
}

$this->_helper->layout()->disableLayout(); предотвращает визуализацию сценария макета (при условии, что вы используете макеты), и $this->_helper->viewRenderer->setNoRender(true); указывает средству визуализации представления не отображать сценарий представления для действия контроллера, которое может содержать некоторый HTML или пробелы.

 4
Author: drew010, 2012-06-08 17:12:12

Это должно сработать

  header("Pragma: public");
  header("Expires: 0");
  header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
  header("Cache-Control: private",false);
  header("Content-Type: application/octet-stream");
  header("Content-Disposition: attachment; filename=\"inventoryData.csv\";" );
  header("Content-Transfer-Encoding: binary");
 -3
Author: Sibu, 2012-06-08 09:29:46

Попробуйте вот это:

header("Content-type: application/octet-stream");
header("Content-disposition:attachment; filename=inventoryData.csv");
 -4
Author: sephoy08, 2012-06-08 09:24:43