Téléchargement de fichier dans Asp.Net MVC 2
Je veux activer le fichier télécharger dans mon application MVC, sans simplement à l'aide d'un lien hypertexte. J'ai l'intention d'utiliser une image ou similaires et de le rendre cliquable en utilisant jQuery. Pour le moment j'ai une simple juste pour le test.
J'ai trouvé une explication de faire le téléchargement par le biais d'une méthode d'action, mais malheureusement l'exemple avait encore actionlinks.
Maintenant, je peux appeler le téléchargement de la méthode d'action, 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.
Voici la méthode de l'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)
};
}
Voici la BinaryContentResult classe:
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 de l'action par le biais de:
<span id="downloadLink">Download</span>
qui est fait cliquable par:
$("#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?
});
});
Noter que le paramètre fileName est reçu correctement par la méthode de l'action et tout et tout, c'est juste que rien ne se passe donc je suppose que j'ai besoin de traiter la valeur de retour d'une certaine manière?
BinaryContentResult
classe ne devrait pas exister. Utilisation FileResult
.Ok, est une norme de classe ou quelque chose? Comment serait-il m'aider à résoudre le problème?
OriginalL'auteur Anders | 2010-08-30
Vous devez vous connecter pour publier un commentaire.
Vous ne voulez pas télécharger le fichier à l'aide d'AJAX, vous souhaitez que le navigateur à télécharger. $.get() va le chercher mais il n'y a aucun moyen d'enregistrer localement à partir de Javascript, pour des raisons de sécurité, le navigateur doit être impliqués. Il suffit de rediriger à l'emplacement de téléchargement et le navigateur s'en chargera pour vous.
Utilisation
document.location.href = ...
pour dire au navigateur d'aller à l'url pour télécharger le fichier. Il va voir la disposition du contenu de l'en-tête et de les afficher sur un téléchargement non pas comme une page.Parfait! Juste une question avant de clore ce problème: Lors de l'enregistrer en tant que boîte de dialogue s'affiche, il a le nom de fichier de tri de concaténées avec des traits de soulignement de chemin d'accès et le nom de fichier, comme ceci: 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 d'origine. (Le renforcement par le biais de la méthode de l'action et de la BinaryContentResult le nom de fichier variable a un chemin ordinaire: folder\\folder\\file.txt. Je ne peux pas comprendre où cette concaténation avec des traits de soulignement. Des idées?
Le nom de fichier vous pouvez passer le contenu de la disposition devrait être juste un nom de fichier sans chemin d'accès. Pour des raisons de sécurité, vous ne pouvez pas spécifier où sur le disque dur de l'utilisateur d'un fichier va.
Droite, j'ai eu tort passé dans la mauvaise variable (j'étais un peu fatigué quand je l'ai fait dans le milieu de la nuit :-). Merci pour votre aide!
OriginalL'auteur Ian Mercer