Ajax風(?)なファイルのアップローダーは多々あります。その中でも、この「Uploadify」はかなり使いやすそうです。 画面遷移なしでファイルをアップロードできるのはもちろんのこと、アップロードの進行状況も見られたり、複数ファイルのアップロードにも対応していたりと、非常に良い感じです。また、アップロード完了後やファイルの選択後の振るまい、重複ファイルのチェックなど、色々とオプションの設定が出来...
Ajax風(?)なファイルのアップローダーは多々あります。その中でも、この「Uploadify」はかなり使いやすそうです。
画面遷移なしでファイルをアップロードできるのはもちろんのこと、アップロードの進行状況も見られたり、複数ファイルのアップロードにも対応していたりと、非常に良い感じです。また、アップロード完了後やファイルの選択後の振るまい、重複ファイルのチェックなど、色々とオプションの設定が出来るのも嬉しいです。
jQuery のプラグインということもあり、敷居も低い気がします。
まずは、「uploadify - a multiple file upload plugin for jquery」からファイルをダウンロードします。
解凍したフォルダの中の「example」フォルダをサーバーにアップロードします。
これで準備完了ですので、exampleフォルダ内のindex.phpにアクセスしてみます。
「BROWSE」ボタンが表示されているはずですので、このボタンをクリックしてファイルを選択しましょう。複数のファイルを選択すれば、まとめてアップロードすることもできます。選択すると自動的にファイルがアップロードされます。
exampleフォルダ内の「uploads」フォルダにアップロードされていれば設置成功です!
もし、アップロードがうまくできていなかったら、exampleフォルダ内の「uploads」フォルダのパーミッションを書き込み出来るようにしてみると良いかもしれません。
Uploadifyの良さを体感したところで、使い方をもう少し詳しく見てみます。
まずは、Uploadify を設置したいファイルで以下の CSS と JavaScript を読み込みます。
仮に、exampleフォルダをドメインルートにアップロードしたとすると、読み込むソースは次のようになります。
<link href="/example/css/uploadify.css" rel="stylesheet" type="text/css" />
<script type="text/javascript" src="/example/scripts/jquery-1.3.2.min.js"></script>
<script type="text/javascript" src="/example/scripts/swfobject.js"></script>
<script type="text/javascript" src="/example/scripts/jquery.uploadify.v2.1.0.min.js"></script>
なお、Uploadify を設置するファイルは、同梱されているサンプルファイルは PHP(index.php) になっていますが、HTMLファイルでも問題ないと思います。
次に、Uploadifyのファイル選択ボタンとアップロードの進行を表示するボックスを設置します。
<div id="fileQueue"></div>
<input type="file" name="uploadify" id="uploadify" />
div#fileQueue が、アップロードの進行を表示するボックスで、input#uploadify:file が Uploadify を適用させるボタン(ファイル選択フォーム)です。
最後に、上記でファイルを読み込んだ後に、以下のようなコードを書いて、Uploadify をそのボタンに適用させます。
<script type="text/javascript">
jQuery(function($) {
// #uploadifyはUploadifyを使うinput:fileのID
$("#uploadify").uploadify({
// uploadify.swfのパス
'uploader' : '/example/scripts/uploadify.swf',
// uploadify.phpのパス
'script' : '/example/scripts/uploadify.php',
// 進行表示ボックスに表示されるキャンセルアイコン
'cancelImg' : '/example/cancel.png',
// ファイルをアップロードするフォルダのパス(注意あり。後述)
'folder' : '/example/uploads',
// 進行表示ボックスのID(今はdiv#fileQueueなので)
'queueID' : 'fileQueue',
// ファイルを選択すると同時にアップロードする場合はtrue
'auto' : true,
// 複数ファイルのアップロードを有効にする場合はtrue
'multi' : true
});
});
</script>
Uploadifyは、jQueryプラグインなのでオプション設定も簡単です。オプションについては、「JQuery File Upload Plugin Script - Documentation - Uploadify」に丁寧なドキュメントが用意されているので、そちらもご覧ください(英語です)。
なお、オプションは以下のように指定して、最後の行末はカンマは不要な点に注意しましょう。
'uploader': '/example/scripts/uploadify.swf',
'script' : '/example/scripts/uploadify.php',
(省略)
'auto' : ture,
'multi' : true
Uploadifyに同梱されている「check.php」のパスを書けば、フォルダに同名のファイルが既に存在しているかをアップロード時にチェックしてくれます。既に存在する場合は上書きしていいか聞かれます。
ファイルをアップロードするフォルダです。末尾に「 / 」は付けません。
ドキュメントを読むと、「 / 」で始まる絶対パスか「http://」で始まるURLで指定すると良いような感じで書いてありますが、前記の checkScript を使用する場合は、絶対パスなどの指定だとちょっと不具合が生じます。
jquery.uploadify.v2.1.0.js を見ると、148行目に以下のような記述があります。
postData.folder = pagePath + folder;
これは、checkScript に POST リクエストを送る値として使われています。
また、58〜61行目には以下の記述があります。
var pagePath = location.pathname;
pagePath = pagePath.split('/');
pagePath.pop();
pagePath = pagePath.join('/') + '/';
つまり、checkScript には、folder で指定した値の先頭にファイルのパスを付加した状態で folder が送られることになります。
したがって、checkScript を使用する場合は、絶対パスなどの指定よりも、Uploadify を適用する HTML ファイルからの相対パスで指定するか、先ほどの148行目を以下のようにカスタマイズする必要があります。
if (folder.match(/^\//) || folder.match(/^http/)) {
postData.folder = folder;
} else {
postData.folder = pagePath + folder;
}
アップロードの進行状況を表示するボックスのIDです。このボックスの中に、「uploadifyEXBHDI」のように「uploadify+ランダムの6文字」という一意のIDが振られたdivが生成され、そこにそれぞれのアップロードの進行状況が表示されます。
一度にアップロードできるファイルの数です。デフォルトは 999 になっています。
true にすると、複数ファイルをまとめてアップロードすることができます。
true にするとファイルを選択すれば自動的にアップロードが始まります。これをtrueにしない場合は、次のようなアップロードボタンを設置する必要があります。
<a href="javascript:jQuery('#uploadify').uploadifyUpload()">Upload</a>
次のfileExtでアップロードできるファイルタイプを指定したときに、ブラウザのダイアログボックスの下に表示されるテキストを指定するみたいです。Macだと、どこのことなのか分かりませんでしたが、これを指定しておかないと、次のfileExtが有効になりませんでした。
'*.ext1;*.ext2;*.ext3'というフォーマットで、アップロードできるファイルの拡張子を指定します。
アップロードできるファイルサイズの上限を指定します。単位はbyteです。例えば上限を500KBにする場合は、'500000'と指定します。
Flashのアップロードボタンに表示されるテキストです。デフォルトは'BROWSE'です。僕は'Select files'なんかがいいかな。
任意の画像へのパスを指定して、アップロードボタンの画像を変更できます。
ボタンの横幅を指定します。デフォルトは110です。
ボタンの高さを指定します。デフォルトは30です。
進行状況を表示するボックスの右上にあるキャンセルボタンの画像ファイルを指定します。
ここに設定した関数が、jquery.uploadify.v2.1.0.jsが読み込まれたときに最初に呼ばれます。ここで true を返せば uploadify が適用され、false を返せば uploadify は適用されません。
(例)
'onInit': function(){
return confirm('Uploadifyを使いたいですか?');
},
ここに設定した関数が、アップロードするファイルを選択した後(各ファイルごと)に呼ばれます。その関数で false を返すと、アップロードの進行状況は表示されなくなります。
この関数には、次の3つの引数が渡されます。
なお、creationDate と modificationDate は日時に関するオブジェクトとなっているので、さらに以下のプロパティ(?)でそれぞれの値が取得できます。
上の onSelect で設定した関数は、各ファイルごとに呼ばれます。つまり、3つのファイルを選択したら3回呼ばれます。
それに対して、この onSelectOnce は、ファイル選択に対して1回だけ呼ばれます。つまり、1つのファイルを選択しても3つのファイルを選択しても1回だけ呼ばれます。
呼ばれるタイミングは、onSelect が終わってから呼ばれるようです。
この関数には、次の2つの引数が渡されます。
これらのうち、fileCount や filesSelected などは、違いがちょっと分かりにくいので、以下の例で確認してください。なお、「auto: true」している場合は関係ないと思います。
(例)
まず、image01.png、image02.png、image03.png を選択します。それぞれの値は以下の通りです。
allBytesTotal
11669
fileCount
3
filesSelected
3
filesReplaced
0
続いて、アップロードしないまま image02.png、image03.png、image04.png をアップロードします。image02.png、image03.png は変更で、最終的にアップロードされるのは、image01〜image04 の4ファイルですね。
allBytesTotal
15404
fileCount
4(最終的にアップロードするファイル数ですね)
filesSelected
1(選択した3ファイルのうち今回新たに選択したのは1ファイルですね)
filesReplaced
2(選択した3ファイルのうち2ファイルは変更ですね)
いかがでしょうか。
アップロードするファイルをキャンセルしたときに、ここに設定した関数が呼ばれます。その関数で false を返すとキャンセルを取りやめることができます(ただし、僕の環境では false を返したときに Actionscript のエラーっぽい状況になって、その後何も反応しなくなっちゃいました)。
この関数には、次の4つの引数が渡されます。
uploadifyClearQueue() が呼ばれたときにこの関数が呼ばれます。ここで false を返すと uploadifyClearQueue() を止めることができますが、どうもその後に不具合がでたりしました。
ドキュメントによると、この関数には次の2つの引数が渡されるようですが、2つめの data は確認できていません。
queueSizeLimit で指定した一度にアップロードできる数をこえると、ここで設定した関数が呼ばれます。デフォルトの関数は、「The queue is full. The max size is 設定した数.」とアラートがでるようになっていますが、ここで指定した関数で false を返せば、そのアラートは表示されません。よって、次のように日本語で表示させるという手もありますね。
(例)
'onQueueFull' : function(event, queueSizeLimit) {
alert('一度にアップロードできるファイルは' + queueSizeLimit + 'です。');
return false;
},
この関数には次の2つの引数が渡されます。
アップロード中にエラーが発生したときに、ここで設定された関数が呼ばれます。デフォルトでは、それぞれのファイルのアップロード状況を示すボックスにエラーメッセージが表示されるそうです。
この関数には、次の4つの引数が渡されます。
Flashファイルによって、アップロードするためにファイルが開かれる度に呼ばれる関数を定義します。デフォルト関数はありません。
この関数には、次の3つに引数が渡されます。
アップロードの進行状況を表示する際に呼ばれる関数を定義します。デフォルト関数では、ボックスに進行状況を表すバーが表示されますが、ここで定義した関数で false を返せば、デフォルト関数は呼ばれなくなります。
この関数には、次の4つの引数が渡されます。
1つのファイルのアップロードが完了すると、ここで定義した関数が呼ばれます。デフォルト関数で、アップロードの進行状況を表示するボックスが削除されます。ここで設定した関数で false を返すとデフォルトの関数は呼ばれません。
この関数には、次の4つの引数が渡されます。
上記の onComplete が、1つのファイルが終わるたびに呼ばれるのに対して、onAllComplete はすべてのファイルのアップロードが終わったときに1度だけ呼ばれます。デフォルトの関数はありません。
この関数には、2つの引数が渡されます。
checkScript と併用して使い、サーバー上で同名のファイルが見つかったときに、ここで定義した関数が呼ばれます。デフォルトの関数では、上書きして良いか聞かれます。
ここで定義した関数で false を返すとデフォルトの関数は呼ばれませんが、その場合、cancelFileUpload というアップロードをキャンセルする関数も呼ばれなくなってしまうので、少し注意が必要です。
ちなみに、デフォルトの関数では、上書きして良いかどうかは英語で聞かれるので、日本語にするには、jquery.uploadify.v2.1.0.js の 157行目の以下の部分を日本語にカスタマイズする必要があります。
var replaceFile = confirm("Do you want to replace the file " + data[key] + "?");
この関数には、5つの引数が渡されます。
Uploadify のオプションを変更するのに利用します。
ファイルを選択したら自動でアップロードされる設定('auto':true)をしない場合は「アップロード」ボタンを設置する必要があります。
そのアップロードボタンでこの関数を呼ぶと、アップロードが開始されます。
(例)
<a href="javascript:jQuery('#uploadify').uploadifyUpload()">Upload</a>
アップロードをキャンセルする場合には、この関数にキャンセルしたいファイルの queueID を渡してキャンセルします。進行状況を表すステータスバーの右上にある「×」ボタンではこの関数が以下のように使われています。
(例)
<a href="javascript:jQuery(\'#' + jQuery(this).attr('id') + '\').uploadifyCancel(\'' + ID + '\')"><img src="' + settings.cancelImg + '" border="0" /></a>
ファイルを選択したら自動でアップロードされる設定('auto':true)をしない場合は、ファイルを選択すると queueID で指定したボックスに、進行状況を表すステータスバーが、ファイルの数だけ表示されます。
それらを一度にクリアしたいときにこの関数を使います。
(例)
<a href="javascript:jQuery('#uploadify').uploadifyClearQueue()">Cancel All Uploads</a>
Uploadify でアップロードしたファイルについて、FTPソフトではそのファイルの存在を確認できるのにブラウザでは閲覧できない、という状況に遭遇するかもしれません。
これは uploadify.php(というかPHP?)の仕様なのか、サーバーの仕様なのか、詳しいことは分かりませんが、uploadify.php のアップロードの仕方だと、アップロードしたファイルのパーミッションが「600」などになり、ブラウザではファイルにアクセスできないことが原因です。
このような場合は、uploadify.php の 40行目あたりに次の1行がありますが、
move_uploaded_file($tempFile,$targetFile);
その後ろに、次の1行を挿入すれば大丈夫だと思います。最後の「0666」がパーミッションです。適宜変更してください。
chmod($targetFile, 0666);
以上です。がんばって詳しく書いてみました。いかがでしょうか。