Solucionado (ver solução)
Solucionado
(ver solução)
8
respostas

Fazer Upload de Imagem do Html para a Máquina com C#

Olá!

Como faço para fazer upload de uma imagem para o servidor sendo passada essa imagem através de input type="file" usando C# ASP.NET MVC 5 CORE?

8 respostas
solução!

Oi Diego,

Aqui tem um step-by-step:

http://www.c-sharpcorner.com/article/upload-files-in-asp-net-mvc-5/

João, peguei o código que você passou, mas adaptei pra usar em um formulário de html que recebe outros dados também, mas o arquivo que quero fazer upload sempre vai como null para o controller. Sabe me dizer o porquê?

segue meu código:

//...continuação do código

 public ActionResult CadastroEmpresa(Empresa empresa, Responsavel responsavel, HttpPostedFile file)
        {
            //condição para não permitir que usuário que não seja Administrador consiga acessar a página
            if ((string)Session["perfil"] == "ADMINISTRADOR" || (string)Session["perfil"] == "DESENVOLVEDOR")
            {
                if (empresa.CodEmpresa == null)
                {
                    empresa.CodEmpresa = 0;
                }
                if (empresa.NumInscricao == null)
                {
                    empresa.NumInscricao = "ISENTO";
                }


                if(file.ContentLength > 0)
                {
                    string _FileName = Path.GetFileName(file.FileName);
                    string _path = Path.Combine(Server.MapPath("~/UploadedFiles"), _FileName);
                    file.SaveAs(_path);
                }

                //var imagem = empresa.Logo;

                //string urlArquivo = "https://www.google.com.br/search?q=imagens&rlz=1C1CHZL_pt-BRBR761BR761&source=lnms&tbm=isch&sa=X&ved=0ahUKEwjo56jc9uHXAhVJIZAKHVrIBy4Q_AUICigB&biw=1360&bih=672#imgrc=SWU-4lrUQU5tHM:";
                //string caminhoArquivo = @"C:\Users\diego.grossi\Documents\Projetos C# ASP.NET\Araguaina Team Foundation Ricardo\PortalAraguaina\Content\Imagens\LogosEmpresas\";

                //System.Net.WebClient client = new System.Net.WebClient();
                //client.DownloadFile(urlArquivo, caminhoArquivo);

                //FileStream Stream = new FileStream(caminhoArquivo, FileMode.Open, FileAccess.Read);

                //empresa.CaminhoLogo = caminhoArquivo;


                EmpresaDAO dao = new EmpresaDAO();
                dao.Adiciona(empresa, responsavel);
                Session["alertaSucesso"] = "Registro Incluido!";
                //return View("FormEmpresa");
                return RedirectToAction("ListaEmpresa");  
            }

            Session["alertaErro"] = "Seu usuário não tem permissão para acessar a página selecionada";

            return RedirectToAction("Index", "Usuario");
        }
//...continuação do código

        <div class="form-row">
            <div class="form-group">
                <label for="logo">Insira o Logo da Empresa:</label>
                @Html.TextBox("file", "", new { type = "file" }) <br />
                @*<input type="submit" value="Upload" />*@  
                @*<input class="form-control form-control-sm" id="logo" type="file" name="empresa.Logo"/>*@
            </div>
        </div>

        <div class="form-row">
            <div class="form-group col-md-4">
                <label for="CodResponsavel">Empresa Responsável:</label>

                <select id="CodResponsavel" name="Empres.CodResponsavel" class="form-control form-control-sm">
                    @foreach (var Empres in ViewBag.Responsavel)
                    {
                        <option value="@Empres.CodResponsavel">@Empres.CodResponsavel - @Empres.DsResponsavel</option>
                    }
                </select>
            </div>
        </div>

        <div class="form-row">
            <div class="form-group">
                <button type="submit" class="btn btn-sm btn-dark">Cadastrar</button>
            </div>
            <div class="form-group">
                <a href="@Url.Action("ListaEmpresa", "Empresa")" class="btn btn-sm btn-primary ml-md-2">Lista Empresas</a>
            </div>
            <div class="form-group">
                <a href="javascript:window.history.go(-1)" class="btn btn-sm btn-danger ml-md-2">Voltar</a>
            </div>
        </div>
    </form>
</div>

//...restante do código

Oi Diego, Você postou parte do código e podem ser algumas coisas. Verificaestes dois itens:

  1. O enctype do form:
enctype="multipart/form-data "

2: Configurar o max length do request:

<configuration>
  <system.web>
    <httpRuntime maxRequestLength="?" /> 
  </system.web>
</configuration>

João, no meu form está assim:

<form method="post" action="~/Empresa/CadastroEmpresa" class="formulario col-md-10" enctype="multipart/form-data">

e no Web.Config está assim:

<system.web>
    <compilation debug="true" targetFramework="4.5"/>
    <httpRuntime/>
    <httpModules>
      <add name="ApplicationInsightsWebTracking" type="Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule, Microsoft.AI.Web"/>
    </httpModules>
    <pages controlRenderingCompatibilityVersion="4.0"/>
  </system.web>

João, tive pesquisando em outros foruns e tem uma pergunta semelhante a minha, e a última resposta fala que não é possível enviar no mesmo formulário um arquivo com as outras informações. A pergunta é de 2014, não sei se hoje já mudou. Mas a nível de conhecimento segue o link da pergunta de outra fonte: https://pt.stackoverflow.com/questions/26475/como-fazer-um-post-que-passe-al%C3%A9m-do-formul%C3%A1rio-um-arquivo

Última dúvida. Tem como eu salvar o arquivo em um caminho físico(alguma pasta do computador que não pertence ao projeto)? O exemplo salva em um diretório virtual

string _path = Path.Combine(Server.MapPath("~/UploadedFiles"), _FileName);
                    file.SaveAs(_path);

Oi Diego, O Server.MapPath trabalha somente com pastas que pertencem ao seu projeto. Para especificar um caminho físico, use:

var fileName = Path.GetFileName(fileurl.FileName);
fileurl.SaveAs(Path.Combine(@"c:\projects", fileName));

É necessário garantir que o a conta a qual seu pool de aplicativos está executando tenha permissão para gravar na pasta.

Referência: https://stackoverflow.com/questions/16832070/saving-an-uploaded-file-with-httppostedfilebase-saveas-in-a-physical-path

João! É isso mesmo! Consegui salvar em local fisico! Muito obrigado!