akishin999の日記

調べた事などを書いて行きます。

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 で初期化してやる事で実現できます。