🗂

ファイル名が日本語のファイルをダウンロードさせる方法

に公開

ファイルをダウンロードさせることがあったので、その方法を備忘録としてまとめます。

Webアプリケーションやサイトを開発する際、ファイル名に日本語を使用したファイルをダウンロードさせる必要がある場合があります。しかし、ブラウザや言語環境によっては、日本語のファイル名が正しく表示されなかったり、文字化けしたりすることがあります。この記事では、ファイル名が日本語のファイルを安全にダウンロードさせる方法について説明します。

Content-Dispositionヘッダーの設定

ファイル名を正しく指定するには、Content-Dispositionヘッダーを適切に設定する必要があります。以下は、PHPでの実装例です:

$filename = '日本語ファイル.pdf';
$encoded_filename = rawurlencode($filename);
header('Content-Type: application/pdf');
header("Content-Disposition: attachment; filename*=UTF-8''$encoded_filename");

この方法では、filename*=UTF-8''という形式を使用し、ファイル名をURLエンコードしています。これにより、多くのブラウザで日本語のファイル名が正しく表示されます。

2. フォールバックの提供

一部の古いブラウザは filename* パラメータをサポートしていない可能性があるため、フォールバックとして通常の filename パラメータも提供することをお勧めします:

$filename = '日本語ファイル.pdf';
$encoded_filename = rawurlencode($filename);
header('Content-Type: application/pdf');
header("Content-Disposition: attachment; filename=\"$filename\"; filename*=UTF-8''$encoded_filename");

この方法では、新しいブラウザは filename* パラメータを使用し、古いブラウザは通常の filename パラメータにフォールバックします。

3. サーバー側での文字コード変換

サーバー側で文字コードを変換することで、より幅広いブラウザとの互換性を確保できます。例えば、Shift-JISに変換する場合:

$filename = '日本語ファイル.pdf';
$encoded_filename = mb_convert_encoding($filename, 'SJIS', 'UTF-8');
$encoded_filename = rawurlencode($encoded_filename);
header('Content-Type: application/pdf');
header("Content-Disposition: attachment; filename=\"$encoded_filename\"");

この方法は特に古いブラウザやシステムとの互換性を重視する場合に有効です。

まとめ

日本語のファイル名でファイルをダウンロードさせる際は、以下の点に注意しましょう:

  1. Content-Dispositionヘッダーを適切に設定する
  2. 新旧ブラウザに対応するためのフォールバックを提供する
  3. 必要に応じてサーバー側で文字コード変換を行う

これらの方法を組み合わせることで、多くの環境で日本語のファイル名を正しく扱えるようになります。ただし、全てのケースで完璧に動作するわけではないため、対象となるユーザーの環境に合わせて適切な方法を選択することが重要です。

GitHubで編集を提案

Discussion