je suis nouveau sur ASP.net COre et je voudrais télécharger un fichier (une image) et le stocker dans un dossier secific. j'ai suivi ce tuto ( téléchargements de fichiers dans ASP.NET Core ) mais je ne sais pas comment le stocker dans un fichier, il est juste téléchargé sur le serveur, c'est le html:
<form method="post" enctype="multipart/form-data" asp-controller="UploadFiles" asp-action="Index">
<div class="form-group">
<div class="col-md-10">
<p>Upload one or more files using this form:</p>
<input type="file" name="files" multiple />
</div>
</div>
<div class="form-group">
<div class="col-md-10">
<input type="submit" value="Upload" />
</div>
</div>
c'est le contrôleur
[HttpPost("UploadFiles")]
public async Task<IActionResult> Post(List<IFormFile> files)
{
long size = files.Sum(f => f.Length);
// full path to file in temp location
var filePath = Path.GetTempFileName();
foreach (var formFile in files)
{
if (formFile.Length > 0)
{
using (var stream = new FileStream(filePath, FileMode.Create))
{
await formFile.CopyToAsync(stream);
}
}
}
// process uploaded files
// Don't rely on or trust the FileName property without validation.
return Ok(new { count = files.Count, size, filePath});
}
et c'est la classe que j'utilise
public interface IFormFile
{
string ContentType { get; }
string ContentDisposition { get; }
IHeaderDictionary Headers { get; }
long Length { get; }
string Name { get; }
string FileName { get; }
Stream OpenReadStream();
void CopyTo(Stream target);
Task CopyToAsync(Stream target, CancellationToken cancellationToken = null);
}
j'ai juste besoin de stocker l'image dans un dossier comme: C:\Users\DESKTOP-1603\Desktop\GestionSyndic\GestionSyndic\src\WebApplication1\wwwroot\images\et changer le nom de l'image merci: D
Téléchargement de fichiers dans ASP.NET Core MVC en quelques étapes simples
1.Demo.cshtml Afficher l'extrait de code
<form method="post" enctype="multipart/form-data" asp-controller="Demo" asp-action="Index">
<div class="form-group">
<div class="col-md-10">
<p>Upload one or more files using this form:</p>
<input type="file" name="files" multiple />
</div>
</div>
<div class="form-group">
<div class="col-md-10">
<input type="submit" value="Upload" />
</div>
</div>
Pour montrer la démonstration, j'ai créé un contrôleur de démonstration qui contient 2 méthodes d'action, l'une pour gérer la demande et l'autre pour gérer la demande.
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;
using System;
using System.IO;
using System.Net.Http.Headers;
namespace WebApplication6.Controllers
{
public class DemoController : Controller
{
private readonly IHostingEnvironment _environment;
// Constructor
public DemoController(IHostingEnvironment IHostingEnvironment)
{
_environment = IHostingEnvironment;
}
[HttpGet]
public IActionResult Index()
{
return View();
}
[HttpPost]
public IActionResult Index(string name)
{
var newFileName = string.Empty;
if (HttpContext.Request.Form.Files != null)
{
var fileName = string.Empty;
string PathDB = string.Empty;
var files = HttpContext.Request.Form.Files;
foreach (var file in files)
{
if (file.Length > 0)
{
//Getting FileName
fileName = ContentDispositionHeaderValue.Parse(file.ContentDisposition).FileName.Trim('"');
//Assigning Unique Filename (Guid)
var myUniqueFileName = Convert.ToString(Guid.NewGuid());
//Getting file Extension
var FileExtension = Path.GetExtension(fileName);
// concating FileName + FileExtension
newFileName = myUniqueFileName + FileExtension;
// Combines two strings into a path.
fileName = Path.Combine(_environment.WebRootPath, "demoImages") + $@"\{newFileName}";
// if you want to store path of folder in database
PathDB = "demoImages/" + newFileName;
using (FileStream fs = System.IO.File.Create(fileName))
{
file.CopyTo(fs);
fs.Flush();
}
}
}
}
return View();
}
}
}
Instantané lors du débogage
Emplacement du dossier où les images sont stockées
Vous devez injecter IHostingEnvironment
pour pouvoir obtenir l'emplacement racine Web (wwwroot
par défaut).
public class HomeController : Controller
{
private readonly IHostingEnvironment hostingEnvironment;
public HomeController(IHostingEnvironment environment)
{
hostingEnvironment = environment;
}
[HttpPost]
public async Task<IActionResult> UploadFiles(List<IFormFile> files)
{
long size = files.Sum(f => f.Length);
// full path to file in temp location
var filePath = Path.GetTempFileName();
foreach (var formFile in files)
{
var uploads = Path.Combine(hostingEnvironment.WebRootPath, "images");
var fullPath = Path.Combine(uploads, GetUniqueFileName(formFile.FileName));
formFile.CopyTo(new FileStream(fullPath, FileMode.Create));
}
return Ok(new { count = files.Count, size, filePath });
}
private string GetUniqueFileName(string fileName)
{
fileName = Path.GetFileName(fileName);
return Path.GetFileNameWithoutExtension(fileName)
+ "_"
+ Guid.NewGuid().ToString().Substring(0, 4)
+ Path.GetExtension(fileName);
}
}
Cela enregistrera les fichiers dans le répertoire images
dans wwwroot
.
Assurez-vous que l'attribut action
de votre balise de formulaire est défini sur la méthode d'action UploadFiles
de HomeController (/Home/UploadFiles
)
<form method="post" enctype="multipart/form-data" asp-controller="Home"
asp-action="UploadFiles">
<div class="form-group">
<div class="col-md-10">
<p>Upload one or more files using this form:</p>
<input type="file" name="files" multiple />
</div>
</div>
<div class="form-group">
<div class="col-md-10">
<input type="submit" value="Upload" />
</div>
</div>
</form>
Je ne sais pas très bien pourquoi vous voulez renvoyer Ok résultat de cela. Vous pouvez probablement renvoyer un résultat de redirection vers la page de liste.
Je viens d'utiliser la réponse acceptée de @Saineshwar, mais j'ai fait un peu de refactoring comme une méthode d'extension pour faciliter l'utilisation d'IFromFile
public static string MakeFileUniqueName(this IFormFile formFile)
{
if (formFile.Length > 0)
{
string fileName =
ContentDispositionHeaderValue.Parse(formFile.ContentDisposition).FileName.Trim('"');
// concatinating FileName + FileExtension
return Guid.NewGuid() + Path.GetExtension(fileName);
}
return string.Empty;
}