kait0401
@kait0401

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

phpspreadsheetで複数ファイルを同時にダウンロードしたい。

したいこと

phpspreadsheetでカテゴリー別にファイル自体を分けて出力したい。

本来はsaveの後にexitが必要なのですが、ファイルを分けて出力したいのですべてsaveの後にexitをしていますが、これだとファイルが壊れてしまいます。

saveの後にすぐexitをすると単品での出力自体は成功しますが処理が終わってしまうので今回は一番最後でないと使えません。

聞きたいこと

ファイルを分けて出力する方法をお聞きしたいです。

試したこととしてはforce_downloadを使用したのですが、これもexit同様処理が終了してしまいます。(出力は出来ました)
もう一つはフロントで回数分submitをループするというものです。
こちらは複数ファイルの処理が成功しましたが、setTimeoutで実行を遅らせてsubmitしているので、出来れば使いたくないです。

phpspreadsheetで実装したいですが、無理そうでしたらphpで使える他のライブラリでも構いません。

ご教授頂けると助かります。

コード

        if($Ts_bag){
            foreach($Ts_bag as $row){
              $reader = new Reader();
              $reader->setIncludeCharts(TRUE);
              $spreadsheet = $reader->load('template.xlsx');
              $spreadsheet->setActiveSheetIndex(0);
              $sheet = $spreadsheet->getActiveSheet();
              ob_end_clean();
              $fileName = "依頼書.xlsx";
              header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
              header('Content-Disposition: attachment;filename='.$fileName);
              header('Cache-Control: max-age=0');
              $writer->save('php://output');
              $writer = new Xlsx($spreadsheet);
            }
        }
        if($mag){
            foreach ($mag as $row) {
              $reader = new Reader();
              $reader->setIncludeCharts(TRUE);
              $spreadsheet = $reader->load('template.xlsx');
              $spreadsheet->getProperties()->setTitle("mag");
              $sheet = $spreadsheet->getActiveSheet();
              ob_end_clean();
              $fileName = "依頼書.xlsx";
              header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
              header('Content-Disposition: attachment;filename='.$fileName);
              header('Cache-Control: max-age=0');
              $writer = new Xlsx($spreadsheet);
              $writer->save('php://output');
            }
        }
        exit;

解決しました。

どのように実装したかと言うと、ボタンを複数用意し対応するファイルをダウンロードできるように実装しました。

経緯としては、httpは1リクエスト1リスポンスという仕様上無理という回答がありましたので選択肢が以下になりました。

1.zipに纏める
2.複数ボタン式
3.回数分通信のいずれ

1は解凍作業があるのと、今回は3ファイルだけでしたので却下。

3はjsで実装してみたものの、通信が重なり失敗。setTimeOutなどで遅らせると成功するもののファイルサイズが大きくなった場合、エラーの原因になるかと思い却下。

ということで2を選択しました。

html,jsでの実装ですのでコードは省かせて頂きます。

ご回答いただいた方、ありがとうございました!

0

3Answer

http 通信では1つのリクエストに対して1つのレスポンスが返ってきます
1つのレスポンスが返すことができるのは1つのファイルだけです

複数のファイルを返したい場合

  • 複数のリクエストを飛ばす
  • zip にして返す

上記のような方法が考えられます

1Like

Comments

  1. @kait0401

    Questioner

    やはり1リクエストに1ファイルなんですね。。

    参考になりました!
    ありがとうございます^^

既に書かれているコメントにあるように「httpの仕様として無理」なのでphpspreadsheetの手には負えません。
クライアント側から複数のリクエストを送ってもらうようにして、何個目のファイルを送信するかはリクエストパラメータを見て決めるようにするとか。
(「○回目のリクエストだから○個目のファイルを送る」みたいな仕様にすると後で後悔します)

ぶっちゃけzipにした方が楽ですけどね

1Like

Comments

  1. @kait0401

    Questioner

    やはりそうなんですね。。

    ご回答ありがとうございます^^

This answer has been deleted for violation of our Terms of Service.

Your answer might help someone💌