- PR -

【PHP】日本語ファイル名のファイルへのリンク

投稿者投稿内容
久保
会議室デビュー日: 2009/04/14
投稿数: 5
投稿日時: 2009-04-14 09:24
お世話になります。久保と申します。

日本語ファイル名のファイルの取り扱いに関して、過去ログの中に同じ環境・状況のものが見つからなかったので質問させてください。

PHPでファイルアップロードの機能を作成しているのですが、アップロードした日本語ファイル名のテキストファイルや画像ファイルをダウンロードさせる為に、リンクを設定するところで詰まっています。
リンク先URLの一部となる日本語ファイル名に対して、URLエンコードをしてやらないと、リンク先のファイルを開いたりダウンロードしたりすることができないのです。
URLエンコードをしてしまうと、ファイルをダウンロードする際、ファイル名がエンコードされた「%58%36%55」などに設定されてしまって便宜が悪く、お客さんもそれを嫌がっています。

なんとか、URLエンコードを行わずに、日本語ファイル名のファイルに対してリンクを設定する方法はあるでしょうか?

****************************************************************
■環境は下記の通りです。

Apache HTTP server 2.0.63
php 5.2.6
閲覧対象ブラウザは、Internet Explorer 6系、または7系のみ

****************************************************************
■リンク設定部分のコードは下記の通りです。

//ファイルアップロードの際にファイル名をSJISに変換している為、リンク先の文字コードもSJISに変換。
//このコードを書かないと例えURLエンコードを行ってもリンク先のファイルが開けない。
$filename = mb_convert_encoding($filename,"SJIS","EUC-JP");

//URLエンコードの処理。
//これを書かなくてもリンク先のファイルが開ける様にしたいのですが…。
$filename = urlencode($filename);

//ファイルへのリンク設定
echo "<a href=\"".&fileurl.$filename."\" target=\"_blank\">$filename</a>\n";
****************************************************************

必ずURLエンコードを行う必要があるのであれば、それはもう仕方がないと思っています。
ただ、友人の技術者からきいた話では、URLエンコードを行う必要は無いとのことでした。
コードも見せてもらったんですが上記の私のコードとほとんど同じで、どういうことかよく分からずにいます。
環境に拠るものがあるのでしょうか。
ご存知の方がいらっしゃればご教授くださいませ。

[ メッセージ編集済み 編集者: 久保 編集日時 2009-04-14 09:26 ]

[ メッセージ編集済み 編集者: 久保 編集日時 2009-04-14 09:26 ]

[ メッセージ編集済み 編集者: 久保 編集日時 2009-04-14 13:48 ]
デューン
大ベテラン
会議室デビュー日: 2004/04/21
投稿数: 174
お住まい・勤務地: Tokyo
投稿日時: 2009-04-14 10:30
無条件に Shift-JISと言っていますが、
そもそもホストの文字コードはShift-JISなのですか?
久保
会議室デビュー日: 2009/04/14
投稿数: 5
投稿日時: 2009-04-14 11:16
デューンさん

サーバーの文字コードはEUC-JPです。
しかしファイルのアップロード機能を作成する際に、日本語ファイル名のアップロードがうまくいかず、いろいろと試して、ファイル名をSJISに変換する様になったという経緯があります。
それで現在はファイルのアップロードに関しては正常に動いています。
FTPソフトを使用して、アップロードした日本語ファイル名のファイルを扱えています。
デューン
大ベテラン
会議室デビュー日: 2004/04/21
投稿数: 174
お住まい・勤務地: Tokyo
投稿日時: 2009-04-14 12:21
phpはshift-jisということですよね?

友人の環境のphpの文字コード、ホストの文字コード、ファイルの文字コードも確認されると良いでしょう。

FFFTPなんかはホストのファイル名の漢字コードを変えてあげれば何の文字コードのファイル名であっても大体落とせますので
あまり参考にはならないと思います。

翻ってしまいますが、URIにあまりそのままの文字列は使用しないほうが良いと思われますので、
(どこに特殊文字が紛れ込むかわからないため)
できれば、ダウンロード用のphpファイルを作成された方が良いかと思います。

それが無理な場合、UTF-8のファイル名でUTF-8のphpファイルであれば落とせるかも
(軽くは試したんですけど、軽くしか試していないので時間があればあとで試してみます)
久保
会議室デビュー日: 2009/04/14
投稿数: 5
投稿日時: 2009-04-14 13:45
デューンさん、いろいろとありがとうございます。

phpのソースファイルもEUC-JPなんです。
なぜファイル名をshift-jisに変換しているのかの理由は、それでうまくいっているから…くらいのもので、完全に理解しているわけでは無く、申し訳ないです。

ただ、ひょっと誤解されているのかも知れないのですが、
作成済のアップロード機能でアップロードするファイルは、phpソースファイルでは無く、テキストファイルであったり、画像ファイルであったりします。
例えばアップロードされてサーバーの指定パスに配置された日本語ファイル名のJPEGファイルを、<a href…>のタグでリンクできればと考えています。
なのでUTF-8のPHPファイルであれば…のところが良く分からずにいます。

デューンさんのおっしゃる様に、<a href…>でリンクを設定するのでは無く、ファイルを選択してダウンロードする専用のphpファイルを作る必要があるのかとも思い始めました。その方法はお客さんの要求とは違うので駄目だとは思うのですが…。
shimix
ぬし
会議室デビュー日: 2004/08/05
投稿数: 512
お住まい・勤務地: 大分市
投稿日時: 2009-04-14 14:47
引用:

久保さんの書き込み (2009-04-14 13:45) より:
なのでUTF-8のPHPファイルであれば…のところが良く分からずにいます。


単にHTTPヘッダのContent-Dispositionでfilenameとして生のUTF-8を渡す・・ということだろうと推測します。

ウチではphp経由でダウロードさせてます。SJISをurlencodeしたファイル名を使ってます(というかphpファイルにpathinfoで渡しています)が、SJISのまま(phpで受け取っているのでdecode済み)でも問題なく日本語のファイル名でダウンロード出来てますねぇ・・。

#Win環境のApacheなので環境が違いすぎるかもしれません(汗

[ メッセージ編集済み 編集者: shimix 編集日時 2009-04-14 14:48 ]
デューン
大ベテラン
会議室デビュー日: 2004/04/21
投稿数: 174
お住まい・勤務地: Tokyo
投稿日時: 2009-04-14 15:23
EUCのphpで、出力がShift-JISならいいですが、
出力もEUCであればShift-Jisの文字列を出力することは無理でしょう。


UTF8うんぬんは、IE7でアドレスバーに
http://www.xxxx.xxx/新規テキスト.txt
としたり、
別の文字コードのhtmlで"http://www.xxxx.xxx/新規テキスト.txt"というアンカーを作った場合に、
UTF8のファイル名でアップロードした場合だけ表示されたためです。
(IE7がUTF8としてサーバーに送信してるのかなと。)

久保
会議室デビュー日: 2009/04/14
投稿数: 5
投稿日時: 2009-04-14 15:30
shimixさん

ありがとうございます。

<a href…>でリンクを設定するのでは無く、GETでファイル名(パス)を渡した先のphpファイルよりダウンロードをした場合に…ということですね。

直接リンクした場合と、phpファイルを介した場合とでは違いがありそうですね。
phpファイルを介せば、
Header("Content-Disposition: attachment; filename=…
といった様な記述ができますもんね。

スキルアップ/キャリアアップ(JOB@IT)