За последние 24 часа нас посетили 16279 программистов и 1727 роботов. Сейчас ищут 811 программистов ...

Можно ли отправить на скачивание несколько документов подряд?

Тема в разделе "PHP для новичков", создана пользователем borus, 20 ноя 2017.

  1. borus

    borus Активный пользователь

    С нами с:
    16 апр 2012
    Сообщения:
    161
    Симпатии:
    0
    Здравствуйте!

    С помощью кода:
    PHP:
    1. ...            require_once(JPATH_ROOT.DS.'administrator'.DS.'components'.DS.'com_vmpricelist'.DS.'assets'.DS.'classes'.DS.'phpexcel.php');
    2.  
    3.             for ($ii = 1; $ii <= ceil(count($new_arr)/200);$ii++){
    4.                 $this->data = array_slice($new_arr, ($ii-1)*200, 200);
    5.  
    6.                 $excel = new PHPExcel();
    7.                 $excel->setActiveSheetIndex(0);
    8.                 $active_sheet = $excel->getActiveSheet();
    9.                 $active_sheet->getPagesetup()->setOrientation(PHPExcel_Worksheet_PageSetup::ORIENTATION_PORTRAIT);
    10.                 $active_sheet->getPagesetup()->setPaperSize(PHPExcel_Worksheet_PageSetup::PAPERSIZE_A4);
    11.  
    12.                
    13.                 $active_sheet->setTitle('Прайс-лист');
    14.  
    15.  
    16.                 $active_sheet->getColumnDimension("A")->setWidth(110);
    17.                 $active_sheet->getColumnDimension("B")->setWidth(180);
    18.                
    19.                 $active_sheet->setCellValue("A1", 'Каталог изделий');
    20.  
    21. ...              
    22.  
    23.                 header("Content-Type:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
    24.                 $doc_name = "Content-Disposition:attachment;filename='document".$ii.".xls'";
    25.                 header($doc_name);//говорим, что отправляй на скачивание
    26.                 $writer = PHPExcel_IOFactory::createWriter($excel, 'Excel5');
    27.                
    28.                 $writer->save('php://output');
    29.             }
    30.  
    31.             exit();
    чтобы файлы были небольшими и непустыми(наверно такое бывает из-за превышения каких-то лимитов на размеры файла) попытался сгенерировать несколько excel документов. Но в конце отработки скрипта на скачивание в браузер отдается только последний сгенерированный документ. Я неправильно написал код или в принципе на php нельзя организовать последовательное формирование и отправку на скачивание нескольких файлов друг за другом?
     
  2. Zuldek

    Zuldek Старожил

    С нами с:
    13 май 2014
    Сообщения:
    2.381
    Симпатии:
    344
    Адрес:
    Лондон, Тисовая улица, дом 4, чулан под лестницей
    Что означает повторная отправка на скачивание можешь рассказать?
    Ты со своим клиентом как общаешься через веб-сервер, посредством чего?

    Ты отправил вывод нескольких: header(....);м в цикле в рамках одного ответа на клиентский запрос
    Что произойдет если на следующем шаге когда ты снова будешь пытаться заголовки запроса формировать в том же ответе?

    Что мешает отдать на загрузку сформированный архив с файлами?
     
    #2 Zuldek, 20 ноя 2017
    Последнее редактирование: 20 ноя 2017
    borus нравится это.
  3. borus

    borus Активный пользователь

    С нами с:
    16 апр 2012
    Сообщения:
    161
    Симпатии:
    0
    Zuldek, доброе утро. Спасибо за отклик
    1. Последовательное скачивание, не повторное. Вообщем надо скачать информацию в виде эксель документа. Поскольку если в него пихать всё за раз, он скачивается пустым. И вот я пытаюсь запихать информацию в несколько эксель файлов, для чего служит цикл со счётчиком $ii. Надо в общем получить либо один либо несколько файлов с всей информацией каким-то образом.
    2. Второй вопрос не понял. Этот скрипт запускается, когда я клика. в админ панели сайта определенный пункт меню разрабатываемого мною расширения Joomla!
    3. Ответ на ваш третий вопрос не знаю, просветите пожалуйста. Наверно будет как раз только последний файл отдаваться на скачивание.
    4. А как тогда 1) сохранить эти файлы и 2)запихать их затем в архив с помощью php?
     
  4. borus

    borus Активный пользователь

    С нами с:
    16 апр 2012
    Сообщения:
    161
    Симпатии:
    0
    Спасибо. А откуда мне узнать содержимое файла, которое идет вторым параметром указанной вами функции? У меня есть переменная/объект $excel = new PHPExcel();
     
  5. Zuldek

    Zuldek Старожил

    С нами с:
    13 май 2014
    Сообщения:
    2.381
    Симпатии:
    344
    Адрес:
    Лондон, Тисовая улица, дом 4, чулан под лестницей
    там у него есть метод а ля ->addFile куда передаешь путь до файла или содержимое, если оно в памяти. В чем проблема доку по паре методов прочитать?

    Кроме того, вполне возможно тебе достаточно просто в одном xlsx все документы на разных листах объединить, и не городить огороды.

    А расширение твое где в одном ответе пытаешься вернуть несколько заголовков и документов вернет тебе ошибку на втором шаге цикла где ты будешь пытаться вернуть клиенту очередные заголовки ответа сервера. Потому работать не будет.
     
    borus нравится это.
  6. borus

    borus Активный пользователь

    С нами с:
    16 апр 2012
    Сообщения:
    161
    Симпатии:
    0
    Понятно, спасибо
    А как понять, может содержимое создаваемого файла действительно можно взять из памяти? Например, есть такой метод сохранения файла в PHPExcel: $writer->save('php://output');
    Про output есть такая ремарка в документации:
    По ходу речь тут идет не про память?