17

blueimpファイルアップロードプラグイン(基本バージョン)を使用して、マルチファイルアップロードを実装しています。ユーザーがアップロードのためにキューに入れられたファイルを削除できるようにする機能を実装しようとしています。ファイル配列に適切にアクセスする方法がわかりません。addコールバックでは、インデックスは0で、ファイル配列の長さは1です(ユーザーがクリックして削除したファイルのみが含まれます)。divにキューに入れられた各ファイルのリンクを追加しています。これはクリック可能であり、クリックするとファイルが削除されます。

私の考えは、ファイルのインデックスを使用して削除リンクを作成し、それを配列から削除することでしたが、上記の問題のため、インデックスが正しくないことはありません。私もファイル名で試しましたが、「on」コールバックのファイル名は常にアップロード用に選択された最初のファイルです-いくつかのクロージャスコープを理解する必要があります。

プログラムでアップロードキューからファイルを削除するにはどうすればよいですか?

HTML:

<div id="fileBrowserWrapper">
    <form id="myForm" action="#" method="post" enctype="multipart/form-data">
        <input id="uploadDocBrowse" type="file" name="files[]" multiple/>                                                    
    </form>
</div>
<div id="inputFilesBox"></div>
<div id="uploadFilesBox"></div>

そしてファイルアップロードJavaScript:

$('#myForm').fileupload({
    url: "/SomeHandler",
    dataType: 'html',
    autoUpload: false,
    singleFileUploads: false,
    replaceFileInput: false,
    add: function (e, data) {
        console.log("Number of files: " + data.files.length);

        $.each(data.files, function (index, file) {                                       
            $('#uploadFilesBox').append("<div class='uploadBox' id='fileDiv_" + file.name + "'><div class='leftEle'><a href='#' id='link_" + index + "' class='removeFile'>Remove</a></div><div class='midEle'>" + file.name + "</div></div>")
            .on('click', { filename: file.name, files: data.files }, function(event) {                            
                var uploadFilesBox = $("#uploadFilesBox");
                var remDiv = $("#fileDiv_" + event.data.filename);
                remDiv.remove();
                event.data.files.splice(0, 1);                              
            }
        });
    });

    data.context = $('#myButton')
    .click(function () {
        data.submit();
    });              
});
4

3 に答える 3

15

私はこれを解決しました。説明付きのソリューションは次のとおりです。

私はそれをもう少しいじった後、私の解決策を見つけました。重要なのは、私がコールバックしていることを思い出すことでした。したがって、削除機能のイベントハンドラーでは、data.files配列をゼロにし、そのハンドラーの送信では、ファイル配列の長さが0より大きい場合にのみ送信します。イベントハンドラー関数をクリーンアップしたので、目には簡単です。HTMLは変更されていません。

新しいJavaScript処理コード:

 $('#myForm').fileupload({
            url: "/SomeUrl",
            dataType: 'html',            
            add: function (e, data) {
                $.each(data.files, function (index, file) {
                    var newFileDiv = $("<div class='uploadBox' id='fileDiv_" + file.name + "'><div class='leftEle'><a href='#' id='link_" + index + "' class='removeFile'>Remove</a></div><div class='midEle'>" + file.name + "</div></div>");
                    $('#uploadFilesBox').append(newFileDiv);

                    newFileDiv.find('a').on('click', { filename: file.name, files: data.files }, function (event) {                        
                        event.preventDefault();
                        var uploadFilesBox = $("#uploadFilesBox");
                        var remDiv = $(document.getElementById("fileDiv_" + event.data.filename));
                        remDiv.remove();                        
                        data.files.length = 0;    //zero out the files array                                     
                    });

                    data.context = newFileDiv;
                });

                $('#myButton')
                    .click(function () {
                        if (data.files.length > 0) {     //only submit if we have something to upload
                            data.submit();
                        }                                                    
                    });
            }
});
于 2012-12-26T21:36:45.027 に答える
4

@Furynationをありがとう。

私がしたことはあなたのアプローチに似ていました。選択したすべてのファイルについて、テーブルに行を追加します(アップロード前の送信)。この行は、後で使用するためにdata.contextに割り当てます。

参照: https ://github.com/blueimp/jQuery-File-Upload/issues/3083

私のコードスニペットは、コールバックの追加ハンドラーにあります。

 $("#upload").click(function () {
                 if (data.files.length > 0) { 
                     data.submit();
                 }
            });
            data.context.find('a').on('click',function (event) {  
                event.preventDefault();
                data.context.remove();   
                data.files.length = 0;   
            });

これにより、テーブルの行が削除され、配列がリセットされます。

よりクリーンな方法があれば、私に知らせてください。

于 2014-05-05T06:18:49.337 に答える
1

複数のファイルに対して機能します-すべてのファイルをチェックし、エラーのあるファイルがすべてのファイルの真ん中にある場合(.splice()または.lenght=0do)に壊れることはありません。アイデアは次のとおりです。検証を行う->エラーの場合:ファイルのインデックスにエラーのマークを付ける->すべてのファイルの後/アップロード前:間違ったインデックス/ファイルを削除/削除する$.grep() ->適切なファイルを一緒にアップロードするsingleFileUploads: false

$(this).fileupload({
        // ...
        singleFileUploads: false,   // << send all together, not single
        // ...
        add: function (e, data) {

            // array with all indexes of files with errors
            var error_uploads_indexes = [];

            // when add file - each file
            $.each(data.files, function(index, file) {

                // array for all errors - in example is only one: size
                var uploadErrors = [];

                // ... validation

                        // check size
                        if(data.files[index]['size'] > 1048576) {
                            uploadErrors.push('Filesize is too big');
                        };
                // ...

                // when errors
                if(uploadErrors.length > 0) {

                    // mark index of error file
                    error_uploads_indexes.push(index);
                    // alert error
                    alert(uploadErrors.join("\n"));

                };

            }); // << each


            // remove indexes (files) with error
            data.files = $.grep( data.files, function( n, i ) {
                return $.inArray(i, error_uploads_indexes) ==-1;
            });


            // if are files to upload
            if(data.files.length){
                // upload by ajax
                var jqXHR = data.submit().done(function (result, textStatus, jqXHR) {
                        //...
                     alert('done!') ;
                        // ...
                });
            } // 

        },
        // ...
    }); // << file_upload
于 2014-03-24T22:31:21.367 に答える