Asp.net mvc dropzonejs多文件上载未按预期工作

Asp.net mvc dropzonejs多文件上载未按预期工作,asp.net-mvc,http,asp.net-mvc-4,file-upload,dropzone.js,Asp.net Mvc,Http,Asp.net Mvc 4,File Upload,Dropzone.js,我试图使用多重上传,但在我的MVC操作中,我没有得到上传文件的列表,而是得到每个上传项目的文件[] 我正在上载2个文件,但当我通过以下方式在控制器中访问此文件时: foreach (string filename in Request.Files) { var file = Request.Files[filename]; //file.name always reads from file[] and picks

我试图使用多重上传,但在我的MVC操作中,我没有得到上传文件的列表,而是得到每个上传项目的文件[]

我正在上载2个文件,但当我通过以下方式在控制器中访问此文件时:

        foreach (string filename in Request.Files)
        {
            var file = Request.Files[filename];
            //file.name always reads from file[] and picks the first file in all requests


        }
我的全部要求是:

Request URL: http://localhost:54434/1328/uploads/new
Request Method:POST
Status Code:201 Created
Request Headersview source
Accept:application/json
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Cache-Control:no-cache
Connection:keep-alive
Content-Length:8957136
Content-Type:multipart/form-data; boundary=----WebKitFormBoundarysX8tBB9TH4BzWZsG
Cookie:glimpsePolicy=On; _gauges_unique_month=1; _gauges_unique_year=1; _gauges_unique=1; glimpseId=Chrome 28.0; __RequestVerificationToken=itQ6HqqB_D7H_Y924w-HFfF8tq
ASP.NET_SessionId=cnj4lzpunuxnbyunl1m5gtpn
Glimpse-Parent-RequestID:04a1b6d2-6c6a-4da0-936d-3ff39e5b8c6c
Host:localhost:54434
Origin:http://localhost:54434
Referer:http://localhost:54434/1328/uploads/new
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36
X-Requested-With:XMLHttpRequest
Request Payload
------WebKitFormBoundarysX8tBB9TH4BzWZsG
Content-Disposition: form-data; name="__RequestVerificationToken"

dmPL-YRqsiwjKy43rlkYIBJE4kPlthsyL0IgnyHbtrD7Doczpbu9Z1SYeoL_93vuR15-6HfpNCCEzkzLYHBIxFJOQd3ynRGGYqILGpMWdLE1
------WebKitFormBoundarysX8tBB9TH4BzWZsG
Content-Disposition: form-data; name="private_upload"

true
------WebKitFormBoundarysX8tBB9TH4BzWZsG
Content-Disposition: form-data; name="files[]"; filename="Maid with the Flaxen Hair.mp3"
Content-Type: audio/mp3


------WebKitFormBoundarysX8tBB9TH4BzWZsG
Content-Disposition: form-data; name="files[]"; filename="Sleep Away.mp3"
Content-Type: audio/mp3


------WebKitFormBoundarysX8tBB9TH4BzWZsG--
Response Headersview source
Cache-Control:private, s-maxage=0
Content-Encoding:gzip
Content-Length:57
Content-Type:application/json; charset=utf-8
Date:Fri, 16 Aug 2013 10:55:23 GMT
Server:Microsoft-IIS/8.0
X-AspNet-Version:4.0.30319
X-AspNetMvc-Version:4.0
X-Powered-By:ASP.NET
X-SourceFiles:=?UTF-8?B?QzpcUHJvamVjdHNcU3VydmVudHJpeFxhcHBcU3VydmVudHJpeFxGYXN0U3VydmV5b3JzXDEzMjhcdXBsb2Fkc1xuZXc=?=
````

Dropzone配置为:

<script type="text/javascript">
        Dropzone.autoDiscover = false;

        var myDropzone = new Dropzone("form#my-awesome-dropzone", {
            paramName: "files", // The name that will be used to transfer the file
            autoProcessQueue: false,
            forceFallback: false,
            uploadMultiple: true,
            maxFilesize: 10,
            previewsContainer: ".dropzone-previews",
            clickable: ".dropzone" //make only this region clickable
        });

        myDropzone.on("addedfile", function (file) {
            /* Maybe display some more file information on your page */
            console.debug("added a file: " + file.name);
        });

        myDropzone.on("success", function (file) {
            $("#drop-success").show();
        });

        $("#btnDropzone").click(function () {
            myDropzone.processQueue();
        });
    });
</script>

Dropzone.autoDiscover=false;
var myDropzone=newdropzone(“form#my awesome Dropzone”{
paramName:“files”,//将用于传输文件的名称
自动处理队列:false,
强制回退:错误,
uploadMultiple:true,
最大文件大小:10,
PreviewContainer:“.dropzone预览”,
可点击:“.dropzone”//仅此区域可点击
});
myDropzone.on(“addedfile”,函数(文件){
/*可能会在页面上显示更多文件信息*/
调试(“添加了一个文件:“+file.name”);
});
myDropzone.on(“成功”,函数(文件){
$(“#放弃成功”).show();
});
$(“#btnDropzone”)。单击(函数(){
myDropzone.processQueue();
});
});

如何在控制器中获取每个上载的文件以便处理它?将此属性enctype=“multipart/form data”添加到表单中

--编辑

您需要添加此选项

并行上载:10 只上载在并行上载选项中指定的文件数。并行上传的标准值似乎是2

这不是一个好的解决方案,因为您不知道要上载多少文件

所以我编辑了

  $("#btnDropzone").click(function () {

        var fileCount = myDropzone.files.length;
        alert(fileCount);
        alert(fileCount % myDropzone.options.parallelUploads);
        var loopsCount = fileCount / myDropzone.options.parallelUploads;

        if (fileCount % myDropzone.options.parallelUploads != 0) {
            loopsCount = loopsCount + 1;
        }

        alert(loopsCount);
        for (var i = 0; i < loopsCount ; i++) {
            alert(i);
            myDropzone.processQueue();
        }


    });
$(“#btnDropzone”)。单击(函数(){
var fileCount=myDropzone.files.length;
警报(文件计数);
警报(文件计数%myDropzone.options.parallelUploads);
var loopscont=fileCount/myDropzone.options.parallelUploads;
如果(文件计数%myDropzone.options.parallelUploads!=0){
LoopScont=LoopScont+1;
}
警报(LoopScont);
对于(变量i=0;i
如果输入名称
文件[]
实际上是问题所在,那么您可以将Dropzone选项
uploadMultiple
设置为false。这将创建多个请求并单独发送每个文件,而不是在一个请求中发送所有并行上载的文件。

以下解决方案对dropzone 3.7.3有效

要解决此问题,请在dropzone.js中更改此行:

formData.append("" + this.options.paramName + (this.options.uploadMultiple ? "[]" : ""), file, file.name);

别忘了包括这个非小型版本


我将尝试向github上的Enyo推荐此修补程序。

我也遇到了同样的问题。我将mvc操作替换为

        for (int arquivo = 0; arquivo < Request.Files.Count; arquivo++)
        {
            HttpPostedFileBase file = Request.Files[arquivo];

            //...

        }
for(int-arquivo=0;arquivo

现在它工作正常。

我感觉它与.net有关,我认为它是因为所有上传都要传入文件[],它应该是类似文件[0]、文件[1]甚至文件[filename]的东西。不要这样认为,好像您添加了选项“parallelUploads:10”要删除区域选项,它将传递10个文件,如果其值为3,它将传递3个文件。此选项的默认值为2。使用dropzone不需要,OP也不需要。正是我所做的,但我想创建多个上载,因此我正在尝试使其正常工作。如果您要在表单中创建多个输入字段,并希望它们作为数组上载,那么在asp.net中该如何工作?将多个输入字段与
name=“files[]”
属性一起使用是否有效?或者它们需要像
name=“files[1]”“
”这样的索引吗?它们必须有索引,否则根本无法读取。我读取文件的方式是使用framework Request.Files,您可以创建模型绑定以使其工作,但我觉得索引是一个更简单的选项,因为它只会工作。我不认为这会破坏其他框架,对我来说听起来很合乎逻辑…我会在github上做一个PR(我是哈米德),但我真的不知道咖啡脚本:PAFAIK这需要更新:formData.append“#{@options.paramName}{if@options.uploadMultiple然后“[]”else“}”,file,file.name如果你的PR被接受,请你更新你的评论,我会接受的。(对其他想让它工作的人有用):)我也不会做咖啡脚本!但是@Enyo将在下一版本中修复它:)
        for (int arquivo = 0; arquivo < Request.Files.Count; arquivo++)
        {
            HttpPostedFileBase file = Request.Files[arquivo];

            //...

        }