Android端末での画像保存が失敗する
■起こった現象
スマートフォンサイトで待ち受け画像を表示するページを作成、
ユーザー側で画像を長押しし「画像を保存」もしくは「リンク先を保存」を押しダウンロードさせるのですが、
iPhone:サイトからダウンロードが出来、ダウンロード後に端末から表示も出来る Android:サイトからダウンロードは出来るが、ダウンロード後に端末から表示しても何も表示されない
というAndroidのみダウンロードに失敗する現象に遭遇しました。
■待ち受け画像の表示方法
待ち受け画像までの遷移は以下のように行っています。
よくあるフォームに必要項目入力して、その後に待ち受け画像ダウンロードさせる遷移です。
待ち受け画像は直アクセスされても表示されないよう、セッションチェックをするようにしています。
また、フォームはPOSTで遷移するようにしています。
フォーム画面 // セッション開始 ↓ // フォームチェック ↓ // フォーム値をセッションにセット ダウンロード画面 ↓ // セッションチェック 待ち受け画像表示 // セッション破棄 ↓ 待ち受け画像保存
■原因
Android端末で画像保存をした際、アクセスログが以下のようになっていました。
※HTTPステータス、UAの部分のみ抜粋、パスは適当に変更しています。
"GET /wallpaper.jpg HTTP/1.1" 200 29669 - "[端末UA]" "HEAD /wallpaper.jpg HTTP/1.1" 200 - "-" "-" "GET /wallpaper.jpg HTTP/1.1" 200 29669 "-" "AndroidDownloadManager"
アクセスログを見る限り、保存をするを押すと、
- 画像URLに再度GETでアクセスする
- UAがAndroidDownloadManagerになっている
という処理になっていました。※2、3端末でしか確認してないので全ての端末でかは分かりません。。
そのため、画像保存でGETでアクセスした際、セッションチェックで弾かれて画像保存ができないというのが原因でした。
■対応
自分はAndroid端末のみ以下のように対応するようにしました。
- フォームを全てGETに変更
- フォーム画面でセッション開始と同時にトランザクションキーを発行、URLにGETパラメータとして付加
- 待ち受け画像表示時、トランザクションデータにダウンロードコード(適当なランダム英数字)を入れる
- 待ち受け画像保存時、トランザクションキーがあり、かつダウンロードコードがあれば画像保存させてトランザクション破棄
トランザクションキーもセッションもなければ404
ちょっと対応が微妙。。な気がしなくもないですが。。
■AndroidDownloadManagerについて
AndroidDownloadManagerについてネットで調べてもあまり詳しくかかれてないようですが、
おそらくAndroid機のブラウザの1機能だと思われます。
※参照元 http://comile.jp/blog.php?id=1&mid=235738
実際、htc evo で確認した際はAndroidDownloadManagerではなく端末UAでアクセスを確認しました。
それでもGETでもう一度アクセスしているのでセッションチェックで弾かれますが。。