サーバ側で作成したPDFの表示とクライアントPCへの保存時のファイル名の指定 †関連 : サーブレットでファイルダウンロード やりたいこと †
上記(1) は Content-Disposition に inline を指定するだけで実現可能なので、何も難しい事はない。※ただし Content-Type の指定は必須。
RFC的にはどうなのか †これを実現するには、Content-Disposition: inline としながら、filename も指定する事になる。 でも、この組み合わせはありなのか? https://tools.ietf.org/html/rfc6266#section-4.3 4.3. Disposition Parameter: 'Filename' The parameters "filename" and "filename*", to be matched case- Depending on the disposition type, this information might be used どうも、あり らしい。 問題点 †
どのブラウザが問題? †Content-Disposition が inline 時に filename が効かないブラウザがどれかを調べてみた。(ついでにファイル名のエンコードも)
こうやって見ると、やっぱり Google Chrome はかなり優秀。 ※検証に使用したコード : http://www.magata.net/test/download_pdf/ Content-Disposition で指定したfilenameが有効な環境の場合 †以下のとおり実装する。特に難しい所はなし。 実装サンプル(PHPの場合) †// PDFの作成 $data = pdfデータを作成する関数(); // PDFファイル名の指定 pdf_fname = urlencode("xxxx.pdf"); // HTTPヘッダを出力 header("Content-Type: application/pdf"); header("Content-Disposition: inline;filename=\"${pdf_fname}\""); // PDFデータを出力 echo $data; exit; Content-Disposition で指定したfilenameが無効な環境の場合 †この場合は、HTTPヘッダで指定したファイル名でなく、その時に表示しているURLが保存時のファイル名になってしまうので、少し工夫が必要になる。 《案1》 《案2》 案1で妥協できる場合は、inline を attachment に変えるだけなので、詳細は省略。 実装イメージ †保存時に使用したいファイル名がURLになるように、リクエストを行うようにする(リダイレクトさせる)。 上図の(C) の時点で、ブラウザがアクセスしている URL は xxxx.pdf となるので、 実装サンプル(PHPの場合) †※デモ・サンプル : http://www.magata.net/test/download_pdf/ create_pdf.php session_start(); // PDFの作成 $data = PDFを作成する関数(); // PDFをセッションに格納 $_SESSION["download_pdf"] = $data; // リダイレクト $pdf_fname = urlencode("xxxx.pdf"); header("Location: " . "http://" . $_SERVER["HTTP_HOST"] . "/test/download_pdf/" . $pdf_fname); .htaccess (mod_rewriteの定義) RewriteEngine On # PATH変換(pdf -> php) RewriteRule ^.*\.pdf$ load_pdf.php [L] load_pdf.php session_start(); // HTTPヘッダに指定するPDFファイル名( filenameが有効な環境用) $pdf_fname = urlencode("xxxx.pdf"); // セッションに退避しておいたPDFデータを出力 header("Content-Type: application/pdf"); header("Content-Disposition: inline;filename=\"${pdf_fname}\""); echo $_SESSION["download_pdf"]; exit; 上記までで、とりあえず問題点(1)は解決。 |