- ベストアンサー
ダウンロードさせると*.phpにリネームされてしまう。
phpでファイルのダウンローダを作成したのですが、IEで動かすと*.phpと動作しているphpのスクリプトネームにリネームされてしまいます。 FireFoxではリネームされる事無くダウンロードされるのですが、IEでの解決方法をご存知の方、どうぞご教授くださいませ。 コードは $filesize=filesize($filedldir); header ("Accept-Ranges: none"); header ("Content-Length: $filesize"); header ("Content-Type: application/octet-stream"); header ("Content-Disposition: attachment; filename=$fnames"); readfile ($filedldir); exit; といった感じです。 何がおかしいのでしょうか?
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
ANo.6のサンプルコードでも、inline でもダメとなると…、やはりクライアント環境が原因なのかもしれませんね。 少し気になったのは、application/zipにすると「ファイルが見つからない」とエラーになるのは、Cache-Controlが影響しているのではないかと思いました。 参考 http://support.microsoft.com/?scid=kb;ja;436605&spid=2073&sid=204 意外に、お使いのPCのキャッシュをクリアしたら解決したりして…。 他のアプローチとして、そもそもHTTPヘッダがサーバー環境の何らかの影響を受けている、という可能性も、なくはないと思います。 つまり、スクリプトもクライアントも問題はなく、送られてくるデータが、どこかの段階でおかしくなってしまっている、ということです。 これを確認するにはHTTPの内容を確認できるツールなどを使えば良いですが、とりあえずフリーのツール「InetSpy」を紹介しておきます。 http://www.hidemaru.interlink.or.jp/software/inetspy.html これを使うと、サーバーから送られてくるHTTPの内容を見ることができるので、スクリプトが出力しているはずのHTTPと合っているかどうか、確認してはどうでしょう。
その他の回答 (6)
- taseki
- ベストアンサー率66% (155/233)
WinXP SP2 + IE6 で試してみましたが、やはり何も問題ありませんでした。 やはりANo.2に書いた、スクリプトのヘッダ出力以外の部分が原因ではないでしょうか。 原因を絞るため、以下のスクリプトを試してみてください。 -------------------- $fnames = '000_001.pmk'; $filedldir = "./$fnames"; $filesize = filesize($filedldir); header("Accept-Ranges: none"); header("Content-Length: $filesize"); header("Content-Type: application/octet-stream"); header("Content-Disposition: attachment; filename=$fnames"); readfile($filedldir); exit; -------------------- 適当なテキストファイルを作成し、「000_001.pmk」と名前を付け、上記スクリプトと同ディレクトリに保存。 私が試したところ上記スクリプトで問題なく動作しました。 もしリネームされてしまうなら、クライアント環境、問題なく動作すれば、ヘッダ出力以外の部分が原因、つまり作られているスクリプト自体に原因があると思われます。 可能性として、Cache-Control: no-cache ヘッダを使用していませんか? また、ためしに Content-Disposition: inline ではどうでしょうか。
補足
アドバイス度々ありがとうございます。 全て試してみたのですが、やはり結果は*.phpと動作しているphpのスクリプトネームにリネームされてしまいます。 スクリプト自体は特に他に処理しているものもなく、ただ、ファイル名をGETで得ているだけです。 ※download.php?file=000_001.pmkでアクセスし、$filedldir=$_GET['file']としているだけです。 マイクロソフトのサポートページ http://msdn.microsoft.com/library/default.asp?url=/workshop/networking/moniker/overview/appendix_a.asp や http://support.microsoft.com/default.aspx?scid=kb;ja;260519 を参照しているのですが、どうもその通りにはいきません。 tasekiさまのクライアントでは誤動作なしとの事ですが、私のクライアントではうまくいきません。クライアント個別の問題なのかも知れませんね。 う~ん。困りました・・・。
- taseki
- ベストアンサー率66% (155/233)
私がテストした結果では、適当なテキストファイルの拡張子をpmkにしても問題なくダウンロードできました。 また、.htaccessにAddTypeを書いて直接アクセスしても、まったく問題ありませんでした。 したがって、やはり下に書いたようにクライアント特有の問題なのでは? 繰り返しになってしまいますが、お使いのクライアントについて詳しく書けば、回答が得られやすいかもしれません。 これも繰り返しになってしまいますが、 ●そのダウンロードされたファイルは、名前以外、中身は問題ありませんか? バイナリエディタでチェックして、たとえばヘッダが入ってしまっているとか、いずれにしても中身は正常ですか? また、FireFoxでダウンロードした方も、中身は正常でしょうか。 ●そのファイル名は、エンコードが必要、たとえば2バイト文字が含まれているとか、そういうことはありませんか? > ファイルは暗号化済みバイナリファイルですので、そういった事はないと思います。 私がお聞きしたのはファイル名です。中身が暗号化とかバイナリとかではなく、スクリプトで言えば $fnames に何が入っていますか?という意味です。 ファイル名が正しくエンコードされていないと、変更される可能性もあります。 あと気になるのは、「ファイルは存在しません」と表示されてしまうという点。以前にキャッシュコントロールとの絡みでこういう問題があったように思います。これは、FireFoxなどでも同じ現象が起きますか?
補足
アドバイスありがとうございます。 まず、クライアントについては以下の通りです。 OS:WindowsXP SP2 ブラウザ:InternetExplorer6.0 ・ダウンロードされたファイルはリネームされますが、中身は正常です。 ・ファイル名は数字の羅列です。(000_001.pmkなど) また、「ファイルは存在しません」とInternetExplorerではダイアログが表示されますが、FireFoxでは普通にダウンロード可能でした。 何かInternetExplorerに問題があるのでしょうか? お忙しい中、アドバイスいただき、大変感謝しています。よろしくお願いします。
- 春原 なの(@ymda)
- ベストアンサー率37% (668/1777)
header ("Content-Disposition: attachment; filename=$fnames"); を header ("Content-Disposition: filename=$fnames"); にするとどうでしょうか? #あるperlスクリプトソースみて、何か余計かな?と感じてみました。
補足
アドバイスありがとうございます。 そのようにしてみたのですが、変わらず*.phpにリネームされてしまいます。
- taseki
- ベストアンサー率66% (155/233)
もうひとつ ●そのファイル名は、エンコードが必要、たとえば2バイト文字が含まれているとか、そういうことはありませんか?
補足
アドバイスありがとうございます。 ファイルは暗号化済みバイナリファイルですので、そういった事はないと思います。
- taseki
- ベストアンサー率66% (155/233)
私の環境でテストしてみると、問題なく指定ファイル名が表示されます…。 したがって、おそらくはお使いのIE、あるいはスクリプトのヘッダ出力以外の部分が、関係していると思われます。 IEのバージョンなどを詳しく書けば、回答が得られやすいかもしれません。 あくまでも勘ですが、 ●header より前に、標準出力に何か書き出していませんか? ●そのダウンロードされたファイルは、名前以外、中身は問題ありませんか? ●ためしに「application/octet-stream」を「application/zip」にするとどうでしょう。
補足
アドバイスありがとうございます。 問題はファイルの拡張子にあるのかも知れません。 拡張子は*.pmkといった通常のMIMEタイプにない未知のもので、別に作成したアプリケーション専用の暗号化済みデータファイル(バイナリ)です。 .htaccessにはAddType application/octet-stream pmkと登録させているのですが、実際に表記のスクリプトでダウンロードさせるとIEの場合のみ*.phpにリネームされてしまいます。 header より前に書き出しているものはありません。また、application/zipに変更してしまうと、「ファイルは存在しません」と表示され、ダウンロードできません。 何か解法があればと思っているのですが・・・
- taseki
- ベストアンサー率66% (155/233)
header ("Content-Disposition: attachment; filename=$fnames"); の部分を、 header ("Content-Disposition: attachment; filename=\"$fnames\""); にすると、どうでしょうか。
補足
アドバイスありがとうございます。 しかしながら、結果は同じでした。 やはり、リネームされてしまいます。何か方法はないものでしょうか?
お礼
taseki さま。 アドバイス感謝いたします。 ご助言のようにHTTPヘッダを確認してみます。 どうも個別のクライアントに原因があるような気がしてきました。 また、色々と試してみます。 ありがとうございました。