-
Softbank携帯で音声3gpをダウンロードできない
Softbank携帯(802SH)で、音声3gpをダウンロードしようとすると、「エラーが発生しました。レスポンスが不正です。(WJ46098E)」と表示される現象がありました。動画3gpは問題なくダウンロード・再生できるのに、なぜ?
3gpファイルは、PHPで吐き出しています。ファイル名は $_SERVER['PATH_INFO'] からとってきます。こんな感じです。
<href=”download.php/xxx/yyy.3gp”>ダウンロード</a>実はセッションを使っていて、session_cache_limiter(‘nocache’)が原因でした。まる一日かかった、その途中経過は...
まず、確認したことは、
・PHPを使わず、3gpファイルに直接アクセスしたら?
→携帯にダウンロードできた。
・”download.php/xxx/yyy.3gp にwgetでアクセスしてみたら?
→元ファイルと同じ内容で保存でき、再生もできた。
なので、ファイルを読んで、吐き出す処理自体に問題はないようです。次に、レスポンスヘッダを比較しました。セッションを使っているので、セッションIDがクッキーにありますね。むむっ?「Cache-Control」がずいぶん長い!
直接アクセス cache-control: no-cache PHP吐き出し Set-Cookie: PHPSESSID=********; path=/ Expires: Thu, 19 Nov 1981 08:52:00 GMT Cache-Control: no-store, no-cache, must-revalidate, post-check=0, (続き) pre-check=0 Pragma: no-cache
テスト用のPHPを組んで、どの行が原因か調べました。結果は「Cache-Control」に「no-store」があるとエラーでした。技術資料http編に「no-store」が記載されていますが、全ての機種で対応していない、ということなのでしょうか。
Cache-Control: no-store →× Cache-Control: no-cache, must-revalidate, post-check=0, pre-check=0 →○
session_cache_limiter の値で、レスポンスヘッダがどう変わるか調べました。
session_cache_limiter('public' ) ↓ Expires: Wed, 02 Jan 2008 09:43:55 GMT Cache-Control: public, max-age=10800 session_cache_limiter('private') ↓ Expires: Thu, 19 Nov 1981 08:52:00 GMT Cache-Control: private, max-age=10800, pre-check=10800 session_cache_limiter('private_no_expire') ↓ Cache-Control: private, max-age=10800, pre-check=10800 session_cache_limiter('nocache') ↓ Expires: Thu, 19 Nov 1981 08:52:00 GMT Cache-Control: no-store, no-cache, must-revalidate, post-check=0, (続き) pre-check=0もともとsession_cache_limiter()を呼んでいなかったので、デフォルトの’nocache’だったようです。’private_no_expire’ にしたところ、音声3gpファイルをダウンロード・再生ができるようになりました。
音声3gpファイル用のディレクトリに置く .htaccess の例AddType audio/3gpp .3gp AddType audio/3gpp2 .3g2 Header set cache-control "no-cache" Header set x-jphone-copyright "no-transfer"
802SHでは、「x-jphone-copyright “no-transfer”」がない場合、
・動画3gp → ○ダウンロード・再生
・音声3gp → ×「エラーが発生しました。レスポンスが不正です。(WJ46098E)」
でした。Leave a reply



最近のコメント