- ベストアンサー
Perlで着メロDLカウント
Perlで着メロをダウンロードさせカウントするスクリプトを書いたのですが、 J-PHONEでmmfファイルをダウンロードすると「REP310 J-PHONEではページを表示できません」というエラーが出てDLできません。 2000サーバーでIISのMIMEは既に登録済みです。 また、DoCoMoのmldは問題なくDLできカウントできます。 スクリプトはHTTP_USER_AGENTとホストで判定し、 J-PHONEの場合はHTTP_X_JPHONE_SMAFで和音数を調べて、 カウントしてからLocationでファイルの絶対パスへ飛ばしてます。 ちなみに、ケータイに直でパスを入れるとダウンロードできます。
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
再度確認です。 -- ソース -- (カウント処理) open(IN,"hoge.mmf"); binmode IN; $src = join("",<IN>); close(IN); binmode STDOUT; print "Content-Type: application/x-smaf\n\n"; print $src; exit; __END__ で、 拡張子に .mmf を付けてアクセスして NG でしょうか? エラーコードも同じですか?
その他の回答 (7)
- ikspiari
- ベストアンサー率48% (29/60)
あ、すみません。 肝心な事を忘れていました。 J-SKY って MIME だけでなく拡張子も見るんですよ。 その CGI のお尻に .mmf を付けてみてください。 例えば、 ~/mero.cgi?mefo.mmf ~/mero.cgi/mero.mmf みたいな感じです。 これ、何回ハマっても忘れてしまう... X-(
補足
ダミー拡張子ですね。 png画像とかもそうですよね。 それも試したんですが、どうにも動いてくれません…
- ikspiari
- ベストアンサー率48% (29/60)
> ソースをコピペ あー、Windows でしたら binmode の記述は必要ですよ。 それで再度試して頂けませんか?
補足
binmodeにした場合も試してましたがやっぱり変わらなかったです。
- ikspiari
- ベストアンサー率48% (29/60)
度々申し訳ありません。 最初の質問に IIS と書いてありましたね・・・ HTTPD に MIME を登録しても CGI で出力するヘッダは明示的にしてあげないとダメですよ。
補足
こちらこそ度々すいません。 そうなんです。IISです。 デーモンにもMIMEを登録して、CGIでヘッダを出力してもやっぱりできないです。
- ikspiari
- ベストアンサー率48% (29/60)
すみません、自己レスです。 > バイナリファイルなので open した時に join でくっつけているのですが。 これ、よく意味が解りませんね。 とりあえずバイナリファイルは改行は改行として扱わないフォーマットですので join("", <IN> ); としてデータを一つの変数内に代入してるだけです。 配列をまんま出力して問題なければそれでいいと思います。 binmode を使ってるという事は Windows なんでしょうか? 試してみよう・・・
- ikspiari
- ベストアンサー率48% (29/60)
mmfファイルのヘッダは Content-Type: application/x-smaf だと思うのですが・・・ それと、配列ってまんま出力していいんでしたっけ? バイナリファイルなので open した時に join でくっつけているのですが。 FreeBSD 4.4-RELEASE と Apache 1.3.27 の環境では問題なく動作してますよ。No.2 のソースで。
補足
ありがとうございます。 ソースをコピペしてファイルへのパス等変更して吐き出してみたんですけど、 やっぱりREP310のエラーメッセージです。 先程のソースでヘッダを変更してみてもやっぱりDLできませんでした。
- ikspiari
- ベストアンサー率48% (29/60)
そのCGIで直接mmfファイルを出力してはどうでしょう? (カウント処理) open(IN,"hoge.mmf"); $src = join('',<IN>); close(IN); print "Content-Type: application/x-smaf\n\n"; print $src; exit; ダメですか?
お礼
回答ありがとうございます。 open ML,$J_file; binmode ML; my @tmp = <ML>; close ML; binmode STDOUT; print "Content-disposition:attachment; filename=\"$J_file\"\n"; print "Content-type: application/octet-stream\n\n"; print @tmp; としてみたんですが、どうにもできないんですよね。 なんなんでしょうか?
補足
open ML,$J_file; binmode ML; my @tmp = <ML>; close ML; binmode STDOUT; print "Content-disposition:attachment; filename=\"$J_file\"\n"; print "Content-type: application/octet-stream\n\n"; print @tmp; として直接ファイルを吐かせてみたんですがうまくいきません。
- so_blue
- ベストアンサー率48% (50/104)
J-PHONEはLocationに制限があるようです。 ちょっと探せなかったですが、J-PHONEのサイトに 仕様が載っているかもしれません。
お礼
ご回答有難うございます。 参考サイトを見させて頂きました。 やっぱりLocation周りですか。 このヘッダを流してるのは一度なのですがその辺りももう少し調べてみます。
補足
J-PHONEの参考資料(PDFファイル)を読んだのですが、ここにはLocation等ヘッダに関するものやPerlなどプログラム関連の記述はありませんでした。
お礼
やりました。できました。 何が悪かったのかよくわかんなかったんですが、 とりあえず、間に合ったのでこれから調べます。 ご回答くださいました皆さん有難うございました。