全てのサーバに言える事かわかりませんが、
Google App Engine for JavaのBlobstoreにアップロードしたapkファイルをダウンロードした時に、
apkファイルがインストール出来たり、出来なかったりしたので、簡単に調査。
(当然ですが、問題となりやすい
レスポンスヘッダのContent-Typeにapplication/vnd.android.package-archiveが必要というのは
クリアしていることが条件の調査です。)
操作としては大きく次の二つがありますが、
挙動が安定しなかったのは、後者の「ダウンロード→インストール」の場合。
「ダウンロード→展開」の場合は、どれも問題なく出来ました。
・apkファイルダウンロード→展開
・apkファイルダウンロード→インストール
インストール出来ない場合というのは、ダウンロードしたapkファイルを展開する際に
「パッケージの解析中に問題が発生しました」
というエラーが出て、Android端末にインストール出来ない状況です。
今回調査した内容について、
サーバに問題があるのか、クライアントに問題があるのかという事について
googleから公式に発表されていないので、あくまで結果のみの掲載となります。
ではまず前提条件。
クライアント側の設定とサーバ側の設定。
■クライアント側
・formのpostでダウンロード用サーブレットの呼び出し。
・formのgetでダウンロード用サーブレットの呼び出し。
・aタグでダウンロード用サーブレットの呼び出し。
■サーバ側
・リクエストパラメータを解析して、BlobstoreServiceのserveメソッドを利用してダウンロード処理。
プログラムで書くと次のような感じです。
■クライアント側
formの場合の例:
<form action="/hoge/fuga" method="post">
<!-- 必要に応じてパラメータ設定 -->
<input type="submit" value="post"/>
</form>
aタグの場合の例:
<a href="/hoge/fuga?key=${key}">aタグ</a>
■サーバ側(Slim3フレームワークでのプログラムとなります)
BlobstoreService blobstoreService = BlobstoreServiceFactory
.getBlobstoreService();
BlobInfoFactory blobInfoFactory = new BlobInfoFactory();
//BlobKeyを取得
String blobKeyStr = asString("blob-key");
// ブロブキー生成
BlobKey blobKey = new BlobKey(blobKeyStr);
BlobInfo blobInfo = blobInfoFactory.loadBlobInfo(blobKey);
// ファイル名を指定
response.setHeader("Content-Type",
"application/vnd.android.package-archive");
response.setHeader("Content-Disposition", "attachment; filename="
+ blobInfo.getFilename() + "");
blobstoreService.serve(blobKey, response);
return null;
結果はというと、
・formのpostでダウンロード用サーブレットの呼び出し。→×インストール失敗
・formのgetでダウンロード用サーブレットの呼び出し。→○インストール成功
・aタグでダウンロード用サーブレットの呼び出し。→○インストール成功
でした。
冒頭でも記載しましたが、ダメだった理由が、
blobstore特有の挙動によるものなのか、Androidの端末の個体差に何かあるのかというのは不明です。
追伸
formのmethodをgetにしても、サーバ側でリクエストのリファラをいじくると
インストール時にエラーが発生する模様です。
原因はわかりませんが、事象は発生率100%で確認されました。