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

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

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

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

Q&A

解決済

3回答

793閲覧

【PHP】日本語ファイルのダウンロードについて

NEO_PLANETT-777

総合スコア333

PHP

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

0グッド

1クリップ

投稿2019/06/27 07:47

編集2019/06/27 08:07

前提・実現したいこと

PHPでファイルをダウンロードする仕組みを作っています。
ダウンロードの際、日本語のファイル(Excel)をダウンロード
したところ以下の現象が発生しており困っております。

発生している問題・エラーメッセージ

ダウンロードしたファイルが1KBとなり、開こうとすると
破損している趣旨のメッセージが表示されます。
英名であれば、問題なくダウンロードでき開けます。

該当のソースコード

PHP

1【呼び側】 2<a href="http://hogehoge/FileDownload.php?NO=001&NM=あああ.xlsx"> 3 4【FileDownload.php】 5$no = $_GET['NO']; 6$nm = $_GET['NM']; 7$dirPath = "./UpLoadFiles/" .$no ."/"; 8$filePath = $dirPath .$nm; 9 10header('Content-Type: application/octet-stream'); 11header('Content-Length: ' . filesize($filePath)); 12header('Content-Disposition: attachment; filename*=UTF-8\'\''.rawurlencode($nm)); 13 14readfile($filePath);

試したこと

他のサイトに書いてあるような事は一通り試しました。

補足情報(FW/ツールのバージョンなど)

WEBサーバー:XAMPP Version 5.6.11
PHP:5.2.0
ブラウザ:IE11

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

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

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

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

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

guest

回答3

0

ob_end_cleanを入れてみるとか。

PHP

1header('Content-Type: application/octet-stream'); 2header('Content-Length: ' . filesize($filePath)); 3header('Content-Disposition: attachment; filename*=UTF-8\'\''.rawurlencode($nm)); 4 5ob_end_clean(); 6readfile($filePath);

投稿2019/06/27 08:19

mepon

総合スコア480

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

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

NEO_PLANETT-777

2019/06/27 08:27

入れてみましたが、同じ結果となりました。
NEO_PLANETT-777

2019/06/27 09:25

mepon様 無事解決できました、ありがとうございました。
guest

0

ベストアンサー

readfile()でエラーになっていないですか?

投稿2019/06/27 08:50

kasa0

総合スコア578

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

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

NEO_PLANETT-777

2019/06/27 09:24

kasa様のエラーがヒントで、理解しました。 ファイルサイズ取得や、仰るreadfileでエラーしており、パスが文字化けしてたのが原因です。 で後述でエンコードしているので、名称は文字化けしていなかった。 原因は、値を受けた時にエンコードすれば良いみたいです。 $nm = mb_convert_encoding($_GET['NM'], 'SJIS-win', 'UTF-8'); 無事にダウンロード出来るようになりました。 ありがとうございました。
guest

0

PHP5.2はさすがにちょっと難しいですね(環境的にもセキュリティ的にも)

気になる点としては下記でしょうか。

php

1header('Content-Disposition: attachment; filename="'.$fileNm.'"'); 2header('Content-Disposition: attachment; filename*=UTF-8\'\''.rawurlencode($fileNm));

2行attachmentを入れたのはどういう意図でしょうか?
また$fileNmが定義されていません。

上記2点、見直してみてください。
もし「ファイル名に全角文字列が」というのでしたらファイル名を半角文字列だけにして試して正常に動くことを確認してから全角文字列の調整をしていきましょう。

投稿2019/06/27 07:54

m.ts10806

総合スコア80850

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

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

NEO_PLANETT-777

2019/06/27 07:58

ああ、すみません 投稿用に加工しており、attachment消し忘れです。(下が利用している方です) $fileNmも加工ミスで、$nmとなります。
m.ts10806

2019/06/27 08:02

質問本文のコードを更新しておいてください。 ただ$nmそのままとなると filenameは”あああ”となるので拡張子も何もついていないファイルになるのでは?
NEO_PLANETT-777

2019/06/27 08:08

すみません、それも加工ミスです。 あああ.xlsx だと思って下さい。 先程の分と合わせて本文を編集しました。
m.ts10806

2019/06/27 08:13

rawurlencode() を利用しない場合はどうでしょうか。 というか、GETで渡った時点でrawurlencode()された文字列が来ているはずなので(GETはクエリストリングとしてURLになるから)、もし利用するのでしたらrawurldecode()の方だと思います。 それか、mb_convert_encoding()ですね。
NEO_PLANETT-777

2019/06/27 08:25

いくつか試してみました。 文字は正常だがダウンロード結果が異状 header('Content-Disposition: attachment; filename*=UTF-8\'\''.rawurlencode($nm)); 文字化け&ダウンロード結果が異状 header('Content-Disposition: attachment; filename*=UTF-8\'\''.$nm); header('Content-Disposition: attachment; filename="'.$nm.'"'); header('Content-Disposition: attachment; filename='.rawurlencode($nm)); header('Content-Disposition: attachment; filename='.mb_convert_encoding($nm, 'UTF-8', 'ASCII,JIS,UTF-8,CP51932,SJIS-win'));
NEO_PLANETT-777

2019/06/27 09:26

mts10806様 無事解決する事が出来ました。 色々アシストして頂き、有難うございました。
m.ts10806

2019/06/27 09:59

解決されたようで何よりです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問