Em quase todas as minhas conversas com iniciantes em ASP.NET MVC sou questionado sobre como fazer upload de arquivos. Para facilitar a resposta irei documentar o passo-a-passo nesse artigo.

Criação da View

A nossa view conterá um formulário com alguns campos de entrada de texto e um campo para envio de arquivo. Veja com ela é simples:

image

@model MvcFileUpload.Models.User
<h2>
    Envio de arquivos</h2>
@using (Html.BeginForm("FileUpload", "Home", FormMethod.Post, new { enctype="multipart/form-data"}))
{
    @Html.ValidationSummary(true, "Não foi possível fazer o cadastro. Corrija os erros e tente novamente.")
    <div>
        <fieldset>
            <legend>Informações</legend>
            <div class="editor-label">
                @Html.LabelFor(m => m.UserName)
            </div>
            <div class="editor-field">
                @Html.TextBoxFor(m => m.UserName) @Html.ValidationMessageFor(m => m.UserName)
            </div>
            <div class="editor-label">
                @Html.LabelFor(m => m.Email)
            </div>
            <div class="editor-field">
                @Html.TextBoxFor(m => m.Email) @Html.ValidationMessageFor(m => m.Email)
            </div>
            <div class="editor-label">
                Avatar
            </div>
            <div class="editor-field">
                <input type="file" name="Avatar" />
            </div>
            <p>
                <input type="submit" value="Cadastrar" />
            </p>
        </fieldset>
    </div>
}

Veja que essa View possui uma configuração especial na criação do formulário. Temos que dizer ao nosso form para enviar os dados via POST e para definir o Content Type como multipart/form-data. Para que o nosso upload funcione essas configurações são necessárias.

Criação do Controlador

O nosso controlador é bastante simples, temos dois métodos. Um para atender a requisição GET e outro para atender o POST do formulário. Veja só:

public class HomeController : Controller
{
    public ActionResult FileUpload()
    {
        return View();
    }

    [HttpPost]
    public ActionResult FileUpload(User user)
    {
        foreach (string fileName in Request.Files)
        {
            HttpPostedFileBase postedFile = Request.Files[fileName];
            postedFile.SaveAs(Server.MapPath("~/Uploads/") + Path.GetFileName(postedFile.FileName));
        }

        return View();
    }
}

O método FileUpload marcado com HttPost atende o  POST do formulário. Nesse método buscamos os arquivos enviados dentro da propriedade Request.Files e caso encontremos o nosso arquivo basta salvá-lo como fazíamos antigamente.

Demo e Download

Conclusão

Fazer o upload de arquivos com ASP.NET MVC 3 não é difícil. Apenas é feito de uma forma diferente.

Evento Gratuito em Belo Horizonte

No dia 05 de Fevereiro falarei sobre aplicações extensíveis com ASP.NET MVC 3 em um evento organizado pelo DotNetRaptors faça sua inscrição gratuíta.