Très simple de fournir des fichiers directement à partir d'un contrôleur MVC. Voici ce que je préparais plus tôt, pour ainsi dire:
[RequiresAuthentication]
public ActionResult Download(int clientAreaId, string fileName)
{
CheckRequiredFolderPermissions(clientAreaId);
// Get the folder details for the client area
var db = new DbDataContext();
var clientArea = db.ClientAreas.FirstOrDefault(c => c.ID == clientAreaId);
string decodedFileName = Server.UrlDecode(fileName);
string virtualPath = "~/" + ConfigurationManager.AppSettings["UploadsDirectory"] + "/" + clientArea.Folder + "/" + decodedFileName;
return new DownloadResult { VirtualPath = virtualPath, FileDownloadName = decodedFileName };
}
Vous pourriez avoir besoin de faire un peu plus de travail de décider réellement ce fichier à livrer (ou, plus probablement, faire quelque chose de complètement différent), mais je viens de couper à la base comme un exemple qui montre le bit de retour intéressant.
DownloadResult est un ActionResult personnalisé:
public class DownloadResult : ActionResult
{
public DownloadResult()
{
}
public DownloadResult(string virtualPath)
{
VirtualPath = virtualPath;
}
public string VirtualPath { get; set; }
public string FileDownloadName { get; set; }
public override void ExecuteResult(ControllerContext context)
{
if (!String.IsNullOrEmpty(FileDownloadName))
{
context.HttpContext.Response.AddHeader("Content-type",
"application/force-download");
context.HttpContext.Response.AddHeader("Content-disposition",
"attachment; filename=\"" + FileDownloadName + "\"");
}
string filePath = context.HttpContext.Server.MapPath(VirtualPath);
context.HttpContext.Response.TransmitFile(filePath);
}
}
Pas trop mal, mais il y a une fonction intégrée pour cela dans MVC appelé FileContentResult, l'utilisation: return new FileContentResult (octets, « x-EPOC/x-sisx -app "); – mhenrixon
Depuis que je n'ai entendu aucune plainte au sujet des plans je m'en tiendrai à ça :) C'est déjà en production! Merci pour la réponse utile !! – mhenrixon
Ah, je me demande si FileContentResult est un ajout plus récent au framework alors? Je dois avoir acquis ce morceau de code en utilisant l'une des versions d'aperçu. Merci pour les informations mises à jour. – Jason