Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме 15-35 тыс рублей в месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.05.2014, 22:15   #1
marwell.
Пользователь
 
Регистрация: 05.12.2012
Сообщений: 63
Вопрос отдать файл на скачивание

доброго времени суток!
имеется скрипт на js, который отправляет post запросы php скрипту и принимает ответ от сервера.

Код:
  /* Данная функция создаёт кроссбраузерный объект XMLHTTP */
  function getXmlHttp() {
    var xmlhttp;
    try {
      xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
    try {
      xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    } catch (E) {
      xmlhttp = false;
    }
    }
    if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
      xmlhttp = new XMLHttpRequest();
    }
    return xmlhttp;
  }

  function makeRequest(phpfile, zapros, Success ) {
    var xmlhttp = getXmlHttp(); // Создаём объект XMLHTTP
    xmlhttp.open('POST', phpfile, true); // Открываем асинхронное соединение
    xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); // Отправляем кодировку
    xmlhttp.send(zapros); // Отправляем POST-запрос
    xmlhttp.onreadystatechange = function() { // Ждём ответа от сервера
      if (xmlhttp.readyState == 4) { // Ответ пришёл
        if(xmlhttp.status == 200) { // Сервер вернул код 200 (что хорошо)
          Success(xmlhttp); 
        }
      }
    };
  }
все работает отлично, кроме одного момента. Этим же скриптом я отправляю строку серверу, на сервере с этой строкой генерируется файл. Дак вот потом надо отдать этот файл пользователю на скачивание. До этого пользовался вот этим скриптом
PHP код:
function file_force_download($file) {
  if (
file_exists($file)) {
    
// сбрасываем буфер вывода PHP, чтобы избежать переполнения памяти выделенной под скрипт
    // если этого не сделать файл будет читаться в память полностью!
    
if (ob_get_level()) {
      
ob_end_clean();
    }
    
// заставляем браузер показать окно сохранения файла
    
header('Content-Description: File Transfer');
    
header('Content-Type: application/octet-stream');
    
header('Content-Disposition: attachment; filename=' basename($file));
    
header('Content-Transfer-Encoding: binary');
    
header('Expires: 0');
    
header('Cache-Control: must-revalidate');
    
header('Pragma: public');
    
header('Content-Length: ' filesize($file));
    
// читаем файл и отправляем его пользователю
    
readfile($file);

  }

но он не работает при такой отправке методом post... Может кто посоветует как это сделать?
marwell. вне форума Ответить с цитированием
Старый 04.05.2014, 22:25   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,803
По умолчанию

Когда я хочу получить файл, я делаю так:
Код:
window.open('www.blablabla.my?upload=d:\\File_getme.txt');
Ессно webserver настроен на считывание по пути и выдачу файла на подобный запрос с параметром upload. А браузер уже сам разбирается согласно attachment; filename=.
Может тебе тоже пойти таким путем вместо Аякса?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 04.05.2014, 22:44   #3
marwell.
Пользователь
 
Регистрация: 05.12.2012
Сообщений: 63
По умолчанию

а как передать строку? содержимое файла зависит от строки...
да и совсем отказаться от ajax'a не могу, он не только в этом месте участвует...
P.S. строка весьма длинная, поэтому выбрал post

Последний раз редактировалось marwell.; 04.05.2014 в 23:03. Причина: дополнил
marwell. вне форума Ответить с цитированием
Старый 04.05.2014, 23:06   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,803
По умолчанию

Цитата:
а как передать строку?
Ну посмотри же - я в запросе параметром ее передаю.
Цитата:
строка весьма длинная, поэтому выбрал post
Насколько длинная? Неужели больше чем GET вместит?
Ладно допустим она мегадлинная. Скажем гигабайтов 5. Передавай POST, пусть скрипт формирует файл и хранит у себя в каталоге. Потом запроси его обычным способом. Если имя файла будет ассоциировано с сессией, открытой пользователем - программа легко найдет его для конкретного пользователя и вернет. Впрочем можно и не париться - в том же POST передать мегауникальное имя (я предпочитаю с датой до миллисекунд или какой-нить GUID к примеру), тогда скрипт ПХП сформирует файл с этим именем. А дальше его запросишь, ведь имя уже будет известно.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 04.05.2014, 23:06   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,803
По умолчанию

Цитата:
а как передать строку?
Ну посмотри же - я в запросе параметром ее передаю.
Цитата:
строка весьма длинная, поэтому выбрал post
Насколько длинная? Неужели больше чем GET вместит?
Ладно допустим она мегадлинная. Скажем гигабайтов 5. Передавай POST, пусть скрипт формирует файл и хранит у себя в каталоге. Потом запроси его обычным способом. Если имя файла будет ассоциировано с сессией, открытой пользователем - программа легко найдет его для конкретного пользователя и вернет. Впрочем можно и не париться - в том же POST передать мегауникальное имя (я предпочитаю с датой до миллисекунд или какой-нить GUID к примеру), тогда скрипт ПХП сформирует файл с этим именем. А дальше его запросишь, ведь имя уже будет известно.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 04.05.2014, 23:20   #6
marwell.
Пользователь
 
Регистрация: 05.12.2012
Сообщений: 63
По умолчанию

спасибо, кажется понял как надо
marwell. вне форума Ответить с цитированием
Ответ
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как правильно отдать заголовок Сontent-Length SeRhy PHP 0 10.05.2013 20:25
Как определить, какому алгоритму сортировки отдать предпочтение при решении задачи? Proskurina Общие вопросы по программированию, компьютерный форум 2 16.11.2012 15:37
Скачивание страниц Gudzik11 Общие вопросы Delphi 7 05.04.2012 17:21
отдать пользователю php файл aferistz PHP 9 19.07.2011 00:40
отдать файл на загрузку без перехода Rifler PHP 1 26.09.2010 13:20