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");
}
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;
}
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\"");
Vous devez définir les en-têtes suivants sur la réponse:
Content-Disposition: attachment; filename="myfile.png"
Content-Type: application/force-download
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");
}
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);
}
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;
}
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.