2009-03-16 4 views
3

Я знаю, что это возможно, но я не могу понять это.Как отправить данные на PHP без содержания?

У меня есть запрос mySQL, который имеет пару сотен тысяч результатов. Я хочу иметь возможность отправлять результаты, но кажется, что для ответа на загрузку требуется заголовок длины содержимого.

В phpMyAdmin, если вы собираетесь экспортировать базу данных, она сразу же запускает загрузку, FF просто говорит о неизвестном размере файла, но он работает. Я посмотрел на этот код, но не мог понять.

Помощь?

Спасибо.

ответ

9

this document в разделе 14.14 говорится, что В HTTP, оно должно быть послано всякий раз, когда длина сообщения может быть определено до того, как передана, если это не запрещено правилами в разделе 4.4. Это означает, что его НЕ нужно отправлять, если вы не можете сказать его размер.

Просто не отправляйте его.

Если вы хотите отправить части данных браузеру, прежде чем все данные будут доступны, вы используете flush ваш выходной буфер? Может быть, это проблема, а не отсутствие заголовка?

способ использования флеш такова:

  • генерировать некоторый вывод, который следует добавить его в буфер
  • флеш() его, который должен отправить текущий буфер клиенту
  • Гото 1

Таким образом, если ваш запрос возвращает много результатов, вы можете просто генерировать вывод для, скажем, 100 или 1000 из них, затем сброс и т. д.

Кроме того, чтобы сообщить браузеру клиента о попытке сохранить файл вместо его отображения в окне, вы можете попробовать использовать заголовок Content-disposition: attachment. См. Раздел specification здесь, раздел 19.5.1.

+0

У меня есть заголовки, затем у меня есть флеш, затем у меня есть запрос sql. Тем не менее, он не открывает диалог сохранения после флеша. При работе с небольшим файлом он появляется только при загрузке файла. Запросы sql, которые я пытаюсь, занимают 45 секунд, и отслеживает время после отправки заголовков. – phazei

+0

указано немного больше в anwser – kender

+0

Мои заголовки: header ('Content-Type: "'. $ Mime. '"'); header ('Content-Disposition: attachment; filename = "'. $ Filename. '"'); header («Content-Transfer-Encoding: binary»); заголовок ('Истекает: 0'); header ('Pragma: no-cache'); – phazei

0

Вам не нужно устанавливать поле заголовка Content-Length. Это поле заголовка предназначено только для того, чтобы сообщить клиентскому количеству данных, которые он должен ожидать. Фактически, «неправильное» значение может привести к тому, что клиент сбрасывает некоторые данные.

0

Если вы используете плагин LiveHTTPHeaders в FireFox, вы можете увидеть разницу между заголовками, отправляемыми phpMyAdmin, и заголовками, отправляемыми вашим приложением. Я не знаю конкретно, что вам не хватает, но это должно дать вам подсказку. Один заголовок, который я вижу, запускает быстрый тест: «Transfer-Encoding: chunked», и я также вижу, что они не отправляют длину контента. Вот ссылка на плагин FireFox, если вы уже не имеете его: LiveHTTPHeaders

0

длина содержимого HTTP является ДОЛЖНА поле, так что вы можете бросить его ... но вы должны установить кодировку передачи, то есть Посмотрите на Why "Content-Length: 0" in POST requests?

1

Возможно, вы используете gzip, ожидающий создания всего содержимого.Проверьте свой .htaccess для директив относительно этого.

2

Вы можете использовать закодированное кодирование передачи. В основном вы отправляете заголовок «Передача-кодирование: chunked», а затем данные отправляются в режиме chunked, что означает, что вы отправляете длину фрагмента, за которым следует кусок. Вы продолжаете повторять это до конца данных, после чего вы отправляете кусок нулевой длины.

Подробная информация находится в RFC 2616.

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