2
votes

Comment télécharger un fichier png avec ASP.NET Core

J'ai besoin que l'utilisateur puisse télécharger des images png depuis mon site. Lorsque le mthod s'exécute, il se termine sans erreur mais aucune image n'est téléchargée. Je n'ai pas besoin que l'utilisateur voit une boîte de dialogue contextuelle, car c'est certainement utile. Voici ce que j'ai en ce moment:

        $.ajax({
            url: "./MyHome/DownloadImage",
            type: "Get",
            data: {filename : filename},
            success: function (file) {
            },
            error: function (request, status, error) {
                console.log(request.responseText);
            }
        });
    }

Cette méthode est appelée par un appel ajax dans la vue qui ressemble à ceci

public async Task<IActionResult> DownloadImage(string filename)
        {
            var path = Path.GetFullPath("./wwwroot/images/school-assets/" + filename);
           MemoryStream memory = new MemoryStream();
            using (FileStream stream = new FileStream(path, FileMode.Open))
            {
                await stream.CopyToAsync(memory);
            }
            memory.Position = 0;
            return File(memory, "image/png", "download");
        }

Edit: Si je fichier console.log dans la partie de réussite, je vois une chaîne d'octets donc je sais qu'il crée le fichier mais ne laisse pas l'utilisateur accéder à i. J'ai essayé la disposition de contenu et la création d'un résultat de fichier physique comme suggéré.


1 commentaires

Comment avez-vous demandé DownloadImage ? Que voulez-vous dire par aucune image est téléchargement.


4 Réponses :


0
votes

Vous devez définir le type de disposition de contenu pour permettre le téléchargement direct du fichier:

   var fn = Path.Combine(env.WebRootPath, "test.png");

   var contentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment");

   Response.Headers[HeaderNames.ContentDisposition] = contentDisposition.ToString();

   return new PhysicalFileResult(fn, "image/jpeg");

Si vous préférez, vous pouvez également utiliser le type PhysicalFileResult qui prend en charge votre flux et renvoie FileResult depuis votre contrôleur. Dans ce cas, votre code ressemble à ceci:

public IActionResult OnGetPng()
{
    var bytes = System.IO.File.ReadAllBytes("test.png");

    var cd = new System.Net.Mime.ContentDisposition
    {
        FileName = "test.png",
        Inline = false
    };

    Response.Headers.Add("Content-Disposition", cd.ToString());
    Response.Headers.Add("X-Content-Type-Options", "nosniff");

    return File(bytes, "image/png");

}

Pour accéder à WebRootPath vous devez injecter IHostingEnvironment env dans votre constructeur.


0 commentaires

2
votes

Pour File , vous devez fournir le nom du fichier avec l'extension de fichier, sinon le fichier téléchargé ne pourra pas s'ouvrir.

Essayez quelque chose comme

public async Task<IActionResult> DownloadImage(string filename)
{
    var path = Path.GetFullPath("./wwwroot/images/school-assets/" + filename);
    MemoryStream memory = new MemoryStream();
    using (FileStream stream = new FileStream(path, FileMode.Open))
    {
        await stream.CopyToAsync(memory);
    }
    memory.Position = 0;
    return File(memory, "image/png", Path.GetFileName(path));
}


3 commentaires

J'ai fait cela en utilisant un appel ajax dans la vue. Lorsqu'il s'exécute, je peux imprimer le résultat dans la console et voir la chaîne d'octets, mais aucune boîte de dialogue d'image ne s'affiche pour le télécharger. HEre est l'exemple ajax. `` `fonction DownloadImage (filename) {$ .ajax ({url:" ./MyHome/DownloadImage ", tapez:" Get ", données: {filename: filename}, success: function (file) {}, erreur: fonction (requête, état, erreur) {console.log (request.responseText);}}); } `` `


@Caleb Si vous souhaitez télécharger un fichier par ajax, vous devez implémenter l'événement click, essayez de vous référer à Télécharger le fichier Excel avec .Net core 2 et EPPlus


Merci, j'essaierai ceci quand je serai au travail. Vous donnera la réponse si cela fonctionne



0
votes

@Caleb monsieur à partir du code ci-dessous, vous pouvez télécharger un fichier png.

Télécharger le fichier png du dossier

   [HttpGet]
            public FileStreamResult DownloadPngFileFromDataBase(string id)
            {
                var _fileUpload = _db.ImageFileUpload.SingleOrDefault(aa => aa.fileid == id);         
                // _fileUpload.FileContent column type is byte
                MemoryStream ms = new MemoryStream(_fileUpload.FileContent);
                return new FileStreamResult(ms, "image/png");
            }

Télécharger le fichier png de la base de données

[HttpGet]
        public FileStreamResult DownloadPngFile(string fileName)
        {            
            var stream = new FileStream(Directory.GetCurrentDirectory() + "\\wwwroot\\images\\school-assets\\" + fileName, FileMode.Open);
            return new FileStreamResult(stream, "image/png");
        }

Pour plus d'informations, veuillez également consulter cette question et réponse. Téléchargez le fichier PDF dans le noyau asp.net (réponse acceptée) et un autre lien supplémentaireTéléchargez les fichiers dans le noyau asp.net


0 commentaires

0
votes

Vous pouvez utiliser HttpClient

  using (var client = new HttpClient())
           {  
              try
              {
                using var result = await client.GetAsync($"http://{url}"); 
                if (result.IsSuccessStatusCode)
                {                        
                    return await result.Content.ReadAsByteArrayAsync();
                }

              }
             catch(Exception ex)
              {
                  Console.WriteLine(ex.InnerException);
              }
        } 


0 commentaires