SWFUpload でファイルの送信順序を送信するには
Rails + SWFUpload v2.2.0.1 で作成しているファイルアップローダで、選択されたファイルの送信順序をサーバ側で受け取りたくていろいろと調べていたところ、以下のように upload_start_handler 内で file.index を addPostParam に設定する事で受け取れました。
swfu = new SWFUpload({ upload_url:'<%= url_for upload_path(@key) %>', flash_url:'<%= url_for '/swfupload.swf' %>', upload_start_handler: function(file) { this.addPostParam('file_index', file.index); }, ・ ・ ・
ただ、この方法だと何度も選択 -> 送信が繰り返された場合には、値がどんどん増えていってしまいます。
(3ファイルずつ選択し、3 回送信した場合、1 回目「0,1,2」、2回目「3,4,5」、3 回目「6,7,8」、という風になります。)
なので、「3 ファイルまでアップロード可能」「何度か繰り返された場合はその都度前回のファイルを上書き」と言った事を行いたい場合、なかなか難しい事になります。
結局、以下のように JavaScript でカウンタを持つ事で対応しました。
var index = 0; var swfu = null; window.onload = function () { swfu = new SWFUpload({ upload_url:'<%= url_for upload_path(@key) %>', flash_url:'<%= url_for '/swfupload.swf' %>', upload_start_handler: function(file) { this.addPostParam('file_index', index++); }, ・ ・ ・
JavaScript で宣言した変数 index の値を、upload_start_handler で送信してインクリメントしています。
ちなみに、SWFUpload で一度にアップロードする数を制限するには file_upload_limit の値を設定します。
今回のように、何回もアップロード可能だけれども、一回当たり 3 ファイルまで、といった事をやりたい場合は、upload_complete_handler などの中で Stats オブジェクトの file_queued プロパティや successful_uploads プロパティの値を 0 で初期化してやる事で実現できます。