###前提・実現したいこと
PHPを使って、日本語ファイル名を含めたファイル一式をZIPにし、ローカルPCにダウンロードするためのプログラムを作成中です。
(日本語ファイル名を回避するという手段がベストかとは思いますが、どうしても日本語ファイル名を含めて実現したいです。)
開発環境は下記のとおりです
Windows
XAMPP
PHP Version 7.0.9
###プログラムの仕様
配列に圧縮フォルダ内に含めるファイル名一式を格納しておき、そのファイル名が特定のディレクトリに存在すれば、圧縮フォルダ内に追加する仕様を考えております。
###発生している問題・エラーメッセージ
英数字ファイル名でのZIPの圧縮フォルダ自体はダウンロードでき、問題なく解凍できることを確認済です。
日本語名を用いると、どうやらファイルの追加ができておらず、アウトプットされた圧縮ファイルを解凍時にエラーとなってしまいます。
###該当のソースコード
PHP
// Zipクラスロード $zip = new ZipArchive(); // Zipファイル名 $zipFileName = 'hoge.zip'; // Zipファイル一時保存ディレクトリ $zipTmpDir = 'tmp'; $result = $zip->open($zipTmpDir.'/'.$zipFileName, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE); if ($result !== true) { // 失敗した時の処理 } //圧縮フォルダ内に追加したいファイル一覧 $data_array = array('サンプル.txt','サンプル2.txt'); foreach ($data_array as $path_file) { //ファイル存在チェックをするため、SJISにエンコード $path_file_encode = mb_convert_encoding($path_file, 'sjis-win', 'UTF-8'); if (file_exists($path_file_encode)) { $filename = basename($path_file_encode); // 取得ファイルをZipに追加していく $zip->addFile($path_file_encode,$filename); } } $zip->close(); // ダウンロード出力 header('Content-Type: application/zip; name="' . $zipFileName . '"'); header('Content-Disposition: attachment; filename="' . $zipFileName . '"'); header('Content-Length: '.filesize($zipTmpDir.'/'.$zipFileName)); echo file_get_contents($zipTmpDir.'/'.$zipFileName); // 一時ファイル削除しておく unlink($zipTmpDir.'/'.$zipFileName); exit();
###不明な点
$zip->addFile($path_file_encode,$filename);
今のままの$filenameの中身は"�T���v��.txt"のように文字化けした状態となっています。
そもそもaddFileの対象は$path_file_encodeで合っているのかよくわかっていません。
(存在チェックを通っているので、安易に$path_file_encodeを選択しています)
$filename = basename($path_file_encode);
調べているうちに、マルチバイトを用いたbasename関数は扱いに注意が必要なことがわかってきたので、最悪はファイル名を取得する方法はbasename関数でなくても構わないかと思っています。
どうか皆様のお知恵を拝借ください。
まだ回答がついていません
会員登録して回答してみよう