web-dev-qa-db-fra.com

téléchargement d'une image asp.net Core

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

9
DevTest28

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>
  1. DemoController

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

Snapshot while Debuggin

Emplacement du dossier où les images sont stockées

Location of Folder where Images are Stored

10
Saineshwar

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.

5
Shyju

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;
    }
0
Ali