- 締切済み
日本語ファイル名のアップロードとダウンロード
日本語ファイル名のデータを、ブラウザ上のフォームを使ってWEBサーバにアップし、それらをブラウザに一覧表示させてリンクを張り、そのリンクをクリックするとダウンロードできるようなPHPスクリプトを作りたいと思っています。 URLエンコードを行い、日本語ファイル名を半角文字列に置き換えれば問題ないだろうと思ったのですが、URLエンコードされたサーバ上のファイルにさえアクセスできません。 サーバの文字コードがEUCなので、すべてEUCで作成しているのですが…。 例えば、「あ.txt」というファイルを、EUCで作成したフォームでURLエンコードをしてアップロードすると、「%A4%A4.txt」というファイルがサーバにアップされます。 そこで、「http://。。。/%A4%A4.txt」にブラウザでアクセスすると、403エラーが出ます。 次に、ブラウザに一覧表示させたリンク文字列を右クリックして保存しようとすると、「?¢.txt」というファイルを保存しようとするため、ファイルが見つからないとのエラーが出ます。 いろいろな文字コードでファイル名をエンコードしたり、PHPファイルの文字コードを変更したりして試してみたのですが、うまくいきませんでした。 どうすればいいのか教えていただけないでしょうか? なお、日本語は使わない方がいいということは承知しておりますが、数十個ある日本語ファイル名のデータを頻繁に更新しますので、その都度ファイル名を半角に書き換えることは避けたいと思っています。 元々のファイル名も、仕様により日本語である必要があります。 以下、当方の環境を記載いたします。 「ローカル」 WinXPsp2、IE6 「サーバ」 共有レンタルサーバ Apache
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- nick9090
- ベストアンサー率26% (102/378)
ちなみに・・・ 「あ.txt」ならば「%a4%a2.txt」となるはずです。 「%a4%a4」は、「い」ですね。
- nick9090
- ベストアンサー率26% (102/378)
日本語のファイル名だから駄目なのか、それとも半角英字のファイル名でも駄目なのか、まず切り分けのために、フォームから「a.txt」とかをアップしてみてはいかがでしょうか。 アップ後、ブラウザでアクセスしてみて表示されるようなら、日本語ファイル名に関わる何らかの問題がある…ということになります。 逆に英字のファイル名でも403エラーになるようなら、 やはりパーミッションなどが怪しいと思います。
- taketan_mydns_jp
- ベストアンサー率58% (450/773)
403はforbiddenなので、権限が無い等為にアクセス出来ないと言う事です。 ディレクトリ自体に権限が無いか、.txtという拡張子が無効になっているかは分かりませんが。 日本語でアップロード、ダウンロードさせる場合は、ファイル名を適当な文字にしておき(例えばタイムスタンプ等)、それに紐づくファイル名を別に記録(データベース等)しておくのが良いと思います。そうすればサーバの文字数制限も考える必要が無くなります。 ダウンロードする時はPHP側で読込んでから吐き出すようにすれば良いと思います。例えば下記のように。 //ダウンロード用サンプル関数 function downLoadFile( $fname, $jname, $type){ header('Content-type: {$type}');//タイプ header('Content-Disposition: attachment; filename="{$jname}"');//日本語名 readfile($fname);//サーバに保存されているファイル名 } 参考まで。
お礼
ご回答ありがとうございます。 PHP初心者なので、ちょっと難しそうですね。(^^ゞ DBなどを使わず、PHPだけで処理できれば一番いいのですが…。 この方法はあきらめて、まったく別の方法を考えようかと思っています。
- めとろいと(@naktak)
- ベストアンサー率36% (785/2139)
URLエンコードしたファイルをアップしているのですね。 すみません、斜め読みしてしまったせいか、勘違いしていました。 しかもHTTP403エラーが出てくるなら、ディレクトリかファイルに 読込み権限がないのでは。
お礼
再度ご回答ありがとうございます。 ディレクトリのパーミッションは755 テキストファイルのパーミッションは644でしたので、権限については問題ないと思います。
- めとろいと(@naktak)
- ベストアンサー率36% (785/2139)
事実上、サーバには「http://。。。/%A4%A4.txt」というファイルは存在しませんから、 アップロードした時点で、サーバ側へはURLエンコードしたファイル名で保存するなどと 言った方法が一般的です。 それを正しい日本語して表示する場合の為に、日本語のファイル名も保持しておく必要があります。
補足
> 事実上、サーバには「http://。。。/%A4%A4.txt」というファイルは存在しませんから、 これはどういうことなのでしょうか? FFFTPなどで見ると、「%A4%A4.txt」というファイルが見えています。 また、このファイル名をURLデコードすれば、元の日本語ファイル名が表示されますので、日本語ファイル名を保持しておく必要はないと思うのですが、いかがでしょうか?
お礼
ご回答ありがとうございます。 半角英数のファイル名は表示・ダウンロード共うまくいきました。 その際のパーミッションは644でした。 やはり日本語ファイル名が問題だと思います。 URLエンコードしてるのに・・・。
補足
すみません。 エラーは404でした。(^^ゞ エラーページを自作しているため、そのページの記述間違いでした。