2009-04-16 10 views
0

Nous avons un CMS que j'ai créé et qui fonctionne très bien mais maintenant je veux déplacer le téléchargement des fichiers binaires mobiles (installateur) vers le CMS. Ils sont actuellement diffusés depuis un autre serveur.Site de téléchargement de l'application mobile

La seule solution que je peux voir est d'avoir un index de quels fichiers sont dans quels dossiers etc. comme un document XML et utiliser Linq2Xml pour récupérer les fichiers et les diffuser vers le navigateur mobile. Je ne veux vraiment pas utiliser une base de données pour cela. Je pensais à mettre à jour les portails de téléchargement vers MVC en raison des capacités intégrées pour diffuser un fichier directement dans un navigateur en spécifiant byte [], filename et mime.

De meilleures suggestions?

Répondre

1

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); 
    } 
} 
+1

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

+0

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

+0

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

Questions connexes