2013 年 5 月 19 日

apkファイルアップローダーを作る(第1回)

apkファイルアップローダーを作る

[jQuery File Upload]

アップロードしたapkファイルをapktoolでデコードして、アプリの情報を返すコマンドライン形式apkファイルアップローダーを作成してみたいと思います。今回は、jQuery File Uploadのサーバーサイドの実装を利用して作成します。

jQuery File Uploadはjqueryを使って、Webページからファイルアップロードするライブラリです。マルチファイル選択・ドラッグ&ドロップ・プログレスバー・イメージプレビューなど多くの機能を備えています。サーバサイドの実装もPHP,Python,Ruby,Perl,Node.js,Go,Java,Scala,ASP.NETと、非常に多くの言語をサポートしています。
jQuery File Uploadのデモページでは、bootstrapを利用していますが、必須ではありません。

サーバサイドクラス

jQuery File UploadのPHPバージョンのサーバサイドは、UploadHandlerクラスとして実装されています。コンストラクタに様々なオプションが指定できるので、コンストラクタのパラメータだけでも、様々なカスタマイズが可能です。さらに、このクラスを継承し、必要なメソッドをオーバライドすることで、より細かなカスタマイズが可能です。

※jQuery File UploadのクライアントJavascriptの利用方法は、また違う機会にご紹介いたします。

オプション

function __construct($options = null, $initialize = true, $error_messages = null)

$optionsには、今回必要なオプションを設定します。この他にも多くのオプションが指定可能です。

$options = array(
  'user_dirs' => true, // ユーザー毎のディレクトリを作成
  'param_name' => 'file', // パラメータ名を指定
  'accept_file_types' => '/apk$/i', // アップロードするファイル名を正規表現で指定
  'upload_dir' => '/Users/hoge/develop/paads/www/upload/files/' // アップロードファイルの保存パス
);

$initializeは、コンストラクタの中でファイルアップロード処理を実行するなら、trueを指定します。falseにして利用する場面はほとんどないように思います。$error_messageは、エラーメッセージを日本語や他の内容に置き換えるときに指定します。

コントローラー

UploadHandlerクラスをインスタンス化するコントローラーを作成します。

<?php

require('UploadHandler.php');

$options = array(
  'user_dirs' => true,
  'param_name' => 'file',
  'accept_file_types' => '/apk$/i',
  'upload_dir' => '/Users/hoge/develop/paads/www/upload/files/'
);

new UploadHandler($options);

?>

curlコマンドでapkファイルをアップロード

今回はapkファイルをアップロードするだけなので、まずはこのオプションだけでapkファイルをアップロードしてみます。fileパラメータにapkファイルのパスを渡します。上記のPHPスクリプトは、http://www.paads.net/upload/index.phpとして作成しておきます。そして、curlコマンドを使ってhoge.apkをアップロードします。以下が実行結果です。

$ curl -i -F file=@hoge.apk http://www.paads.net/upload
{
  "file" : [
    {
      "name"       : "hoge.apk",
      "size"       : 372225,
      "type"       : "application\/octet-stream",
      "url"        : "http:\/\/www.paads.net\/upload\/files\/9s7fl0ijh5ovnboq0s760qncj0\/hoge.apk",
      "delete_url" : "http:\/\/www.paads.net\/upload\/?file=hoge.apk","delete_type":"DELETE"
    }
  ]
}

アップロードしたファイルの情報がJSONで返ってきます。

urlに含まれる9s7fl0ijh5ovnboq0s760qncj0はセッションIDが利用されています。さきほどのuser_dirsオプションをtrueにすると、セッションIDごとのディレクトリにアップロードファイルを保存します。削除したい場合は、delete_urlを呼び出せば、削除できます。user_dirをtrueにしている場合は、セッションIDごとのディレクトリにファイルが保存されているので、cookieを正しく渡さないと、削除できません。

JSONを返してくれるので、Webページからアップロードを実装するときも、扱いやすいですし、curlコマンドでアップロードできるので、ユニットテストも実施しやすくなります。

次回は、apkファイルを解凍して、アプリのバージョンやパッケージ名も返すところを作成します。

関連記事

  1. apkファイルアップローダーを作る(第2回)
  2. apktoolでアンドロイドアプリの.apkファイルの中身を調べる