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?
Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!
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?
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:
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.
João! É isso mesmo! Consegui salvar em local fisico! Muito obrigado!