サーバー側に作成した複数のPDFファイルをクライアント側にダウンロードさせたいと思っております。
「システムの概要」
ブラウザ画面上に表示した商品一覧から「送り状」「納品書」を作成したい商品を選択し、実行ボタンをクリックすることで、「送り状」「納品書」をPDFで作成し、クライアント側に自動でダウンロードされ、選択した商品は画面上消すという仕組みを考えております。物流発送現場での使用のため、検品しながら流れ作業で書類を作成していきたいので、極力ダイアログなどの画面操作をしないことを考えております。
PHPで構築しております。PDFの作成はFPDFを使用しています。
PDFの作成自体は上手くいっています。
「問題点」
サーバー側で作成したPDFをクライアント側にダイアログ、PDF内容の画面表示をさせずに、ダウンロードさせるところまでいくのですが、そこで処理が止まり、その後、画面の商品一覧から選択済みの商品を消す処理まで実行されない。
また、ダウンロードさせたいPDFは「送り状」「納品書」の2種類で、サイズが違うため、別々のPDFを作成しており、両方ともダウンロードさせたいのですが、1つ目のPDFをダウンロードした時点で処理が止まってしまいます。
「試みた事」
1.PDF作成処理後、以下「送り状」PDFダウンロード関数を呼び出し。
この関数呼び出しのあと、パスを変えたのみの「納品書」PDFダウンロード関数を呼び出す処理と画面で選択した商品を消す処理を書いていますが、そこまでは実行されず、以下「送り状」PDFのダウンロードをして処理は終わっているようです。
lang
1function statement_pdf_download() { 2//フルパス 3$fpath = '/home/xxxxxx/xxxxxxx/pdf/statement.pdf'; 4//ファイル名 5$fname = 'statement.pdf'; 6 7header("Content-Type: application/pdf"); 8header('Content-Length: '.filesize($fpath)); 9header('Content-disposition: attachment; filename="'.$fname.'"'); 10readfile($fpath); 11exit(); 12}
exit();のせいかとも思いましたが、これを無くすとダウンロードしたPDFが破損するようです。
2.上記1の関数の、headerの指定が良くないかと思い、色々変えて実行しましたが、結果は同じでした。
lang
1header('Content-Type: application/octet-stream');
lang
1header('Content-Type: application/force-download');
3.readfile()自体が、処理の終わりにしか使用できないのかと思い、非同期ajaxの実装を試みました。
PDF作成処理と、画面から選択した商品を消す処理を行った後、ブラウザ画面再描画の時に以下javascriptの呼び出しを行うようにしました。しかし、ファイルのダウンロードはされませんでした。
lang
1function getStatementPdf(){ 2 $.ajax({ 3 type: 'POST', 4 url: './lib/statement_pdf_download.php' 5 }).done(function(json){ 6 console.log('実行成功'); 7 console.log(json); 8 }).fail(function(json){console.log('error ', json);}); 9}
Javascriptコンソールを見たところ、このscriptの実行はされていると思います。
また、ダウンロードするPDFの内容もコンソールに表示されていたので、ファイルも読み込んでいると思います。
![イメージ説明]WIDTH:165
非同期だとダウンロード先を見失ってしまったりするのでしょうか。
以上、
そもそも実現可能性があるのかどうかも含め、どうかご助言よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。