質問: struts2を用いてサーバアプリケーションを開発しています。 ユーザがファイルのダウンロード要求をした際に、actionクラスでクライアントのブラウザを識別するようにしており、Safariの場合は文字化け対策としてUTF-8指定しています。 具体的には、例えばファイル名が「あいう.txt」の場合以下のヘッダを付与しています。 Content-Disposition: attachment; filename*=UTF-8''%E3%81%82%E3%81%84%E3%81%86.txt UTF-8なので日本語1文字を3バイトで表現し、各バイトを%00~%FFで表現するため、結果的に1文字を9バイトで表現することになります(例:あ→%E3%81%82)。 つまり日本語のファイル名だと必然的に文字数が多くなるのですが、Content-Dispositionの長さの合計が255バイトを超えるとダウンロードするファイル名がなぜかactionの名前になってしまいます。 UTF-8指定しないと文字化けしてしまうし、かと言ってUTF-8指定すると長さ制限(?)に引っかかってしまうし、、 他のブラウザでは問題なくSafariのみで遭遇している問題なのですが、何か良い解決策や回避方法はないでしょうか?
回答: PHPですが、下記の様なページ&コードを見つけました。 【Content-Disposition ヘッダを使って日本語のファイル名でダウンロードさせる - メモ用紙】 > > Shift_JIS 文字列をそのまま記述すれば正しい結果が得られる。 > > > > ``` > header('Accept-Ranges: bytes'); > header('Content-Type: application/octet-stream'); > if (preg_match('/\bMSIE\b|\bSafari [12345]\b/', getenv('HTTP_USER_AGENT'))) { > header('Content-Disposition: attachment; filename="' . > mb_convert_encoding($filename, 'Shift_JIS', 'UTF-8') . '"'); > } > else { > header('Content-Disposition: attachment; filename*=UTF-8\'\'' . rawurlencode($filename)); > } > header('Content-Length: ' . filesize($file)); > readfile($file); > ``` > >