Blueimp загрузчик нескольких файлов с ASP.NET MVC 3 - PullRequest
10 голосов
/ 21 февраля 2011

Я пытаюсь добавить blueimp File Upload в приложение MVC, и у меня возникают проблемы с получением файлов в действии post (я собираюсь использовать функцию загрузки нескольких файлов). Может кто-нибудь помочь, пожалуйста мне понять это?

На мой взгляд, у меня есть следующий код:

<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>

Код JQuery для загрузки файла blueimp следующий:

$(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 голосов
/ 21 февраля 2011

Действие контроллера SaveFile будет вызываться для каждого файла. Так должно выглядеть так:

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

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

И если вы хотите обрабатывать несколько файлов для загрузки в одном запросе, вы можете взглянуть на соответствующий раздел документации .

1 голос
/ 21 мая 2014

Я знаю, что это старая проблема, но просто чтобы указать здесь. В дополнение к Дарину Димитрову пост-возвращенный json должен быть в формате, совместимом с jQuery File Upload - который ожидает массив, даже если передается один файл. Например:

        return Json(
            new
            {
                files = new[]{
                                new { 
                                        name = "www.png",
                                        size = "1234567"
                                    }
                              }
            }
        );
1 голос
/ 22 марта 2011

Чтобы получить файлы, которые вы можете использовать,

foreach (string inputTagName in Request.Files)
{                
    HttpPostedFileBase file = Request.Files[inputTagName];
}
...