[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ファイルを解凍して、アプリのバージョンやパッケージ名も返すところを作成します。