使用ASP.NET MVC 3的Blueimp多文件上传器

10

我正在尝试将blueimp File Upload添加到MVC应用程序中,但我在接收post action中的文件时遇到了问题(我想要多文件上传功能)。请问有人可以帮我解决这个问题吗?

在我的视图中,我有以下代码:

<form id="file_upload" enctype="multipart/form-data" action="Home/SaveFile" method="post">    
   <input type="file" name="file" multiple="true"/>
   <button>Upload</button>
   <div>Upload files</div>        
</form>
<br />
###############################
<table id="files">
</table>

<button id="start_uploads">Start uploads</button>
<button id="cancel_uploads">Cancel uploads</button>

blueimp文件上传的JQuery代码如下:

$(document).ready(function () {

        $('#file_upload').fileUploadUI({
            uploadTable: $('#files'),
            downloadTable: $('#files'),
            buildUploadRow: function (files, index) {
                return $('<tr><td class="file_upload_preview"><\/td>' +
                        '<td>' + files[index].name + '<\/td>' +
                        '<td class="file_upload_progress"><div><\/div><\/td>' +
                        '<td class="file_upload_start">' +
                        '<button class="ui-state-default ui-corner-all" title="Start Upload">' +
                        '<span class="ui-icon ui-icon-circle-arrow-e">Start Upload<\/span>' +
                        '<\/button><\/td>' +
                        '<td class="file_upload_cancel">' +
                        '<button class="ui-state-default ui-corner-all" title="Cancel">' +
                        '<span class="ui-icon ui-icon-cancel">Cancel<\/span>' +
                        '<\/button><\/td><\/tr>');
            },
            buildDownloadRow: function (file) {
                return $('<tr><td>' + file.name + '<\/td><\/tr>');
            },
            beforeSend: function (event, files, index, xhr, handler, callBack) {
                handler.uploadRow.find('.file_upload_start button').click(callBack);
            }
        });
        $('#start_uploads').click(function () {
            $('.file_upload_start button').click();
        });
        $('#cancel_uploads').click(function () {
            $('.file_upload_cancel button').click();
        });
    });

在控制器中,以下是操作方法:

[AcceptVerbs(HttpVerbs.Post)]
    public ActionResult SaveFile(IEnumerable<HttpPostedFileBase> files)
    {
        foreach (HttpPostedFileBase file in files)
        {
            //some file upload magic                
        }
        return View("MyView");
    }

我正在使用MVC 3。

在动作方法中,如果参数的类型为IEnumerable,则会接收到null,如果参数的类型为HttpPostedFileBase,则以奇怪的方式接收文件,并且动作方法无法正常工作。

非常感谢任何形式的帮助。

干杯!

3个回答

8

SaveFile控制器动作将为每个文件调用。因此它应该是这样的:

[HttpPost]
public ActionResult SaveFile(HttpPostedFileBase file)
{
    //some file upload magic

    // return JSON
    return Json(new
    {
        name = "picture.jpg",
        type = "image/jpeg",
        size = 123456789
    });
}

如果您想在同一请求中处理多个上传文件,可以查看文档的相应部分


嗨Darin,抱歉回复晚了。这就是我需要的,即使用一个请求进行多文件上传(似乎我错过了文档的这一部分)。谢谢! - TestSubject09
文档的那个部分没有说明如何处理一个请求中多个文件的服务器端。HttpPostedFileBase 会变成 IEnumerable<HttpPostedFileBase> 吗? - Matthijs Wessels
更详细的设置和JSON返回类型说明可以在此处找到:https://github.com/blueimp/jQuery-File-Upload/wiki/Setup-v4 - Baldy

1
要获取文件,你可以使用以下方式:
foreach (string inputTagName in Request.Files)
{                
    HttpPostedFileBase file = Request.Files[inputTagName];
}

当他们发送octet MIME类型而不是image/jpeg时,这会在Chrome中引发异常。请认真对待! - user605334

1

我知道这是一个旧问题,但是想在这里指出。除了Darin Dimitrov的帖子之外 - 返回的json应该与jQuery文件上传兼容的格式 - 即使只传输一个文件,也需要数组。例如:

        return Json(
            new
            {
                files = new[]{
                                new { 
                                        name = "www.png",
                                        size = "1234567"
                                    }
                              }
            }
        );

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接