2010-08-30 5 views
5

Je veux activer le téléchargement de fichier dans mon application MVC, sans utiliser simplement un lien hypertexte. Je prévois d'utiliser une image ou similaire et de le rendre cliquable en utilisant jQuery. En ce moment j'ai un simple juste pour tester.Téléchargement de fichier dans Asp.Net MVC 2

J'ai trouvé une explication de faire le téléchargement par une méthode d'action, mais malheureusement l'exemple avait encore des liens d'action.

Maintenant, je peux appeler la méthode d'action de téléchargement très bien, mais rien ne se passe. Je suppose que je dois faire quelque chose avec la valeur de retour, mais je ne sais pas quoi ou comment.

est ici la méthode d'action:

public ActionResult Download(string fileName) 
    { 
     string fullName = Path.Combine(GetBaseDir(), fileName); 
     if (!System.IO.File.Exists(fullName)) 
     { 
      throw new ArgumentException("Invalid file name or file does not exist!"); 
     } 

     return new BinaryContentResult 
     { 
      FileName = fileName, 
      ContentType = "application/octet-stream", 
      Content = System.IO.File.ReadAllBytes(fullName) 
     }; 
    } 

est ici la classe BinaryContentResult:

public class BinaryContentResult : ActionResult 
{ 
    public BinaryContentResult() 
    { } 

    public string ContentType { get; set; } 
    public string FileName { get; set; } 
    public byte[] Content { get; set; } 

    public override void ExecuteResult(ControllerContext context) 
    { 

     context.HttpContext.Response.ClearContent(); 
     context.HttpContext.Response.ContentType = ContentType; 

     context.HttpContext.Response.AddHeader("content-disposition", 

               "attachment; filename=" + FileName); 

     context.HttpContext.Response.BinaryWrite(Content); 
     context.HttpContext.Response.End(); 
    } 
} 

j'appelle la méthode d'action via:

<span id="downloadLink">Download</span> 

qui est fait cliquable via:

$("#downloadLink").click(function() { 
    file = $(".jstree-clicked").attr("rel") + "\\" + $('.selectedRow .file').html(); 
    alert(file); 
    $.get('/Customers/Download/', { fileName: file }, function (data) { 
     //Do I need to do something here? Or where? 
    }); 
}); 

Notez que le paramètre fileName est correctement reçu par la méthode d'action et tout, c'est juste que rien ne se passe donc je suppose que je dois gérer la valeur de retour en quelque sorte?

+0

Votre classe 'BinaryContentResult' ne devrait pas exister. Utilisez 'FileResult'. – SLaks

+0

Ok, est-ce une classe standard ou quelque chose? Comment cela m'aiderait-il à résoudre le problème? – Anders

Répondre

4

Vous ne voulez pas télécharger le fichier en utilisant AJAX, vous voulez que le navigateur le télécharge. $ .get() va le récupérer mais il n'y a aucun moyen d'enregistrer localement à partir de Javascript, pour des raisons de sécurité, le navigateur doit être impliqué. Il suffit de rediriger vers l'emplacement de téléchargement et le navigateur le traitera pour vous.

+0

Ok, pourriez-vous préciser ce que vous voulez dire que je devrais faire s'il vous plaît? Ce que je veux dire, c'est que je pourrais utiliser des liens simples pour le faire, comme dans l'exemple que j'ai obtenu, et la page ne se rechargera pas, mais ouvrira simplement une boîte de dialogue Enregistrer sous. Je veux le même comportement, mais en cliquant sur l'étendue à la place (qui détermine quel fichier doit être téléchargé par une classe de sélection). Pourriez-vous spécifier avec du code? Merci! – Anders

+1

Utilisez 'document.location.href = ...' pour indiquer au navigateur d'accéder à l'URL de téléchargement du fichier. Il verra l'en-tête de disposition de contenu et l'affichera en tant que téléchargement et non en tant que page. –

+0

Parfait! Juste une autre question avant de fermer ce problème: Lorsque la boîte de dialogue Enregistrer en tant que s'affiche, le nom de fichier est concaténé avec des traits de soulignement du chemin et du nom de fichier, comme suit: folder_folder_file.txt. Comment venir? Je veux dire, le téléchargement fonctionne et tout, mais je veux qu'il ait son nom de fichier original. (Passant par la méthode d'action et le BinaryContentResult la variable FileName a un chemin d'accès régulier: dossier \\ dossier \\ fichier.txt Je ne peux pas comprendre où cette concaténation avec des traits de soulignement a lieu.Toutes les idées? – Anders