質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

20116閲覧

ファイルのダウンロード後に別URLへリダイレクト

mokemoke

総合スコア52

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2018/09/05 07:46

編集2018/09/05 08:18

ファイルのダウンロードを行った後、別のURLへリダイレクトさせる為、
以下の様なコードで組みましたが、ダウンロードは出来た物の別URLに
リダイレクトされません。
ちなみに、リダイレクトの部分を追加したところ、ダウンロードされた
ファイルが上手く開かなくなりましたので、記述したコードでは出来ない
のかもしれませんが・・・
コード上、何か漏れている部分が御座いましたら、アドバイス願います。

PHP

1<?php 2 ini_set('display_errors', 1); 3 error_reporting(E_ALL | E_STRICT); 4 5 // PhpSpreadsheet読み込み 6 require_once 'c:\windows\system32\vendor\autoload.php'; 7 8 // 読み込みオブジェクト指定 9 $reader = new PhpOffice\PhpSpreadsheet\Reader\Xlsx(); 10 $reader->setIncludeCharts(TRUE); 11 12 // テンプレート読み込み 13 $book = $reader->load('nippou_template.xlsx'); 14 15 // エクセルファイルをダウンロードする 16 //header("Content-Description: File Transfer"); 17 //header('Content-Disposition: attachment; filename="test.xlsx"'); 18 //header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); 19 //header('Content-Transfer-Encoding: binary'); 20 //header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 21 //header('Expires: 0'); 22 //ob_end_clean(); //バッファ消去 23 //$writer = new PhpOffice\PhpSpreadsheet\Writer\Xlsx($book); 24 //$writer->save('php://output'); 25 26 // 別URLへリダイレクト 27 $next_url = "nippo_sentaku.php"; 28 header("Location: {$next_url}"); 29?>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

1回のhttp要求でダウンロードとリダイレクトは同時にできません。どちらか片方です。
つまり、PHP側だけでなんとかするのは無理です。

php側はダウンロードだけにしておき、
クライアント側のjavascript等で、ダウンロードが完了した後に
ページ遷移させるなどの実装が楽だと思います。

投稿2018/09/05 08:32

taka-saan

総合スコア665

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mokemoke

2018/09/05 09:48

taka-saanさん、こんにちは。 アドバイス頂き、ありがとうございます。 やはり同時では出来ないのですね。 とりあえずjavascriptで遷移させるべく、以下のコードに書き換えてみましたが、 画面が遷移せず、ダウンロード後のファイルも上手く開けない状況です。 組み込み方に問題があるかと思いますが、とにかくPHP初経験なので、 良くわからない状況です。 引き続きアドバイス等ございましたら、お願い致します。 ```php // 別URLへリダイレクト $next_url = "nippo_sentaku.php"; $src = '<script type="text/javascript">'; $src .= 'document.location.assign('; $sqc .= $next_url; $sqc .= ');'; $src .= '</script>'; echo $src; ```
guest

0

ベストアンサー

headerで宣言するとその処理中はすべてそのモードになります。
つまりダウンロード(attachment)で宣言すると、そのあとのすべての出力はダウンロードファイルの一部として含まれてしまうことになります。
もしExcelをダウンロードしようとしているとしたら、そのあとにhtmlが書かれていたらExcelとしては正しくないファイル=破損ファイルとしてなってしまう可能性が高いです(良くてExcelの中にそのhtmlが書き込まれる)
header宣言のあとは「これ以上処理・出力なし」ということでexit();を置くこともよくあります。(少なくとも私がみてきた中では)

一応、javascriptでダウンロード終了を検知するという記事があるので1つ試してください。
他には、ダウンロード処理の最後にファイルを削除するように書いておき、非同期(JavaScript)でPHPを実行し、ファイルの存在をチェックし、なくなっていたら削除された→リダイレクト というのも考えられなくはないですが、ダウンロードしたいファイルをどのように作っているかにもよるので、ダウンロードファイルそのものよりもダミー用のファイルのほうが作りとしては現実的かもしれません。

ただ、今回の質問内容は非常にスポットでの質問(大きな流れの中での一部分のみ)ですので、もう少し全体の流れを要件として追記いただけると、代替案が提案できるかもしれません。

投稿2018/09/05 11:59

編集2018/09/05 12:02
m.ts10806

総合スコア80842

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mokemoke

2018/09/06 01:42

mts10806さん、こんにちは。 アドバイスありがとうございます。 とりあえず「javascriptでダウンロード終了を検知する」の記事内容を試してみたいと思います。 それから全体の流れについてですが、処理としては清掃作業の日報データを登録し、登録された データをお客様単位で抽出し、作業日別、月別、総計の3種類のエクセルを作成し、ダウンロード する流れになります。 最初の画面でお客様を選択し、次の画面で作業日を指定し、作業内容(コード分けされている)と 作業時間を入力して、データベースに登録します。 こちらで作成しているエクセルを生成してダウンロードする処理(画面なし)については、 お客様を選択する画面と作業時間を登録する画面の2か所から呼び出され、お客様選択の 画面から呼び出された場合は、そのお客様の全件を抽出し、日毎にシート分けした日報、 月毎にシート分けした月報、総計のシートにデータをセットし、1つのブックにまとめて ダウンロードさせ、作業時間登録の画面から呼び出された場合は、そのお客様のその日の データを抽出し、日報シートにセットしてダウンロードさせます。 エクセルの操作についてはPhpSpreadsheetを利用し、日報・月報・総計のシートを含む テンプレートのエクセルファイルを読み込み、データをセットしております。 ダウンロードについては、HTTPヘッダを用いて、PhpSpreadsheetで作成したシートを ブラウザに出力させる事で実現しております。 全体の流れをの中で、何かアドバイスが御座いましたら、引き続きお願い致します。
m.ts10806

2018/09/06 13:41

確認と返信遅れました。 特に問題はなさそうですが下記が気になります。 「ダウンロードについては、HTTPヘッダを用いて、PhpSpreadsheetで作成したシートを ブラウザに出力させる事で実現しております。」 私が知らないだけかもしれませんが、Excelのシートをそのままブラウザ出力ってヘッダにそのようなものありましたっけ・・?結局ダウンロードになるような気がします(xlsファイルリンクに直接貼った場合ダウンロードになりますよね) いずれにしてもブラウザで表示した時点でhtmlもクライアント側でダウンロードされた情報(キャッシュと言ったほうがいいか)を表示しているので、既に書いたように多重ダウンロードのような形になると思います。
mokemoke

2018/09/07 02:08

mts10806さん、こんにちは。 アドバイスありがとうございます。 とりあえずダウンロード側の処理でリダイレクトを意識しなくても良いとの話が ありましたので、クローズと致します。 また何かありましたら、よろしくお願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問