проблема с загрузкой csv-файла через HTTP заголовок

#php #mysql #file #http-headers

#php #mysql #файл #http-заголовки

Вопрос:

итак, попытался это:

 header("Content-type: application/csv");
header("Content-Disposition: attachment; filename=file.csv");
header("Pragma: no-cache");
header("Expires: 0");
echo $fields;
  

пробовал также и многие другие.

 header("Content-type: text/csv");
  

однако происходит то, что данные MySQL просто передаются эхом в браузер.

это HTTPheaderResponse, который я получил с помощью firebug:

 Date    Wed, 18 May 2011 14:15:18 GMT
X-Powered-By    PHP/5.1.6
Content-disposition attachment;filename=MyVerySpecial.csv
Connection  close
Content-Length  992
Server  Apache/2.2.3 (Red Hat)
  

РЕДАКТИРОВАТЬ: обратите внимание, что это возврат из jQuery .post() Я пытаюсь это сделать, если это повлияет на это.

итак, кто-нибудь знает, почему может возникнуть эта проблема? Я в растерянности.

Спасибо

Комментарии:

1. есть ли у вас какие-либо выходные данные перед заголовками? ваш код в порядке и должен работать

2. что ж, если посмотреть на мою последнюю правку, я пытаюсь сделать это как возврат jQuery .post(), если это может повлиять на это?

3. это должна быть просто ссылка. Зачем вам нужен jquery.post?

4. ну, это дополнительная функция на странице, и поэтому я запрашиваю базу данных для перехода к файлу, не обновляя страницу.

5. лол. Э-э, да, это была бы важная информация. : ) Лучше всего использовать реальную форму и сделать традиционную публикацию … что можно сделать с iFrame для поддержания поведения, подобного AJAX.

Ответ №1:

Прежде всего, обязательно установите второму параметру header() значение true, это для принудительной установки заголовка:

 header('Content-Type: text/csv');
  

Сообщите, что вы знаете размер загрузки, вы должны:

 header('Content-Length: '.strlen($fields));
  

Наконец, убедитесь, что $fields это на самом деле строка в формате CSV.

Вы не можете напечатать массив напрямую и ожидать, что браузер автоматически преобразует его в CSV.

Ответ №2:

Правильный тип MIME — это text/csv . Попробуйте это.

Ответ №3:

Попробуйте пометить Content-type как application/download или application/force-download . Это должно заставить браузер открыть диалоговое окно сохранения.