PHP、Smarty、ケータイサイトについて発信中。書籍 「Smarty動的webサイト構築入門」(技術評論社) 好評発売中
RSS icon Home icon
  • 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)」
    でした。

    2008-01-02 admin No comments 02.PHP, 04.ケータイ

    Leave a reply