web-dev-qa-db-fra.com

ASP.NET MVC télécharger l'image plutôt que de l'afficher dans le navigateur

Plutôt que d'afficher un PNG dans la fenêtre du navigateur, j'aimerais que le résultat de l'action déclenche la boîte de dialogue de téléchargement de fichier (vous connaissez l'ouvrir, l'enregistrer sous, etc.). Je peux faire fonctionner cela avec le code ci-dessous en utilisant un type de contenu inconnu, mais l'utilisateur doit ensuite taper .png à la fin du nom de fichier. Comment puis-je accomplir ce comportement sans forcer l'utilisateur à taper l'extension de fichier?

    public ActionResult DownloadAdTemplate(string pathCode)
    {
        var imgPath = Server.MapPath(service.GetTemplatePath(pathCode));
        return base.File(imgPath, "application/unknown");
    }

Solution....

    public ActionResult DownloadAdTemplate(string pathCode)
    {
        var imgPath = Server.MapPath(service.GetTemplatePath(pathCode));
        Response.AddHeader("Content-Disposition", "attachment;filename=DealerAdTemplate.png");
        Response.WriteFile(imgPath);
        Response.End();
        return null;
    }
35
RSolberg

Je pense que vous pouvez contrôler cela avec l'en-tête de disposition de contenu.

Response.AddHeader(
       "Content-Disposition", "attachment; filename=\"filenamehere.png\""); 
42
womp

Vous devez définir les en-têtes suivants sur la réponse:

  • Content-Disposition: attachment; filename="myfile.png"
  • Content-Type: application/force-download
10
Aren

En fait, je suis venu ici parce que je cherchais l'effet inverse.

    public ActionResult ViewFile()
    {
        string contentType = "Image/jpeg";



        byte[] data = this.FileServer("FileLocation");

        if (data == null)
        {
            return this.Content("No picture for this program.");
        }

        return File(data, contentType, img + ".jpg");
    }
5
Paul Totzke

Avec MVC j'utilise un FileResult et retourne un FilePathResult

public FileResult ImageDownload(int id)
    {
        var image = context.Images.Find(id);
        var imgPath = Server.MapPath(image.FilePath);
        return File(imgPath, "image/jpeg", image.FileName);
    }
3
Iain M Norman

La bonne façon de télécharger le fichier dans votre cas est d'utiliser la classe FileResult.

 public FileResult DownloadFile(string id)
{
try
{
    byte[] imageBytes =  ANY IMAGE SOURCE (PNG)
    MemoryStream ms = new MemoryStream(imageBytes);
    var image = System.Drawing.Image.FromStream(ms);
    image.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
    var fileName = string.Format("{0}.png", "ANY GENERIC FILE NAME");
    return File(ms.ToArray(), "image/png", fileName);
}
catch (Exception)
{
}
return null;
}
1
Developer

En fait, je @ 7072k3

var result = File(path, mimeType, fileName);
Response.ContentType = mimeType;
Response.AddHeader("Content-Disposition", "inline");
return result;

Copié cela à partir de mon code de travail. Cela utilise toujours le type de retour ActionResult standard.

1
user714055