Pergunta

Estou tentando adicionar Carregamento de arquivo blueimp para um aplicativo MVC e estou tendo problemas para receber os arquivos na ação de postagem (estou optando pela funcionalidade de upload de vários arquivos). Alguém pode me ajudar a descobrir isso?

Na minha opinião tenho o seguinte código:

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

O código JQuery para upload de arquivo blueimp é o seguinte:

$(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();
        });
    });

E dentro do controlador o seguinte método de ação:

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

Estou usando MVC 3.

No método action, se o argumento for do tipo IEnumerable ele recebe null e se o argumento for do tipo HttpPostedFileBase ele recebe os arquivos de forma estranha e o método action não funciona como deveria.

Qualquer tipo de ajuda é muito apreciada, obrigado.

Saúde!

Foi útil?

Solução

O SaveFile a ação do controlador será chamada para cada arquivo.Então deve ficar assim:

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

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

E se você quiser lidar com vários arquivos de upload na mesma solicitação, você pode dar uma olhada no respectiva seção da documentação.

Outras dicas

Para obter os arquivos que você pode usar,

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

Eu sei que este é um problema antigo, mas apenas para apontar aqui.Além de Darin Dimitrov post - o json retornado deve estar em formato compatível com Carregamento de arquivo jQuery - que espera array mesmo se um arquivo for transmitido.Por exemplo:

        return Json(
            new
            {
                files = new[]{
                                new { 
                                        name = "www.png",
                                        size = "1234567"
                                    }
                              }
            }
        );
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top