Je me suis fait suggérer d'utiliser FileResult pour permettre aux utilisateurs de télécharger des fichiers depuis mon application Asp.Net MVC. Mais les seuls exemples que je puisse trouver concernent toujours les fichiers image (en spécifiant le type de contenu image / jpeg).
Mais que faire si je ne connais pas le type de fichier? Je veux que les utilisateurs puissent télécharger à peu près n'importe quel fichier à partir de la zone de fichiers de mon site.
J'avais lu une méthode pour le faire (voir un article précédent pour le code), qui fonctionne vraiment bien, sauf pour une chose: le nom du fichier qui apparaît dans la boîte de dialogue Enregistrer sous est concaténé à partir du chemin d'accès au fichier avec des traits de soulignement ( folder_folder_file.ext). De plus, il semble que les gens pensent que je devrais retourner un FileResult au lieu d'utiliser cette classe personnalisée que j'avais trouvée BinaryContentResult.
Quelqu'un connaît-il la "bonne" façon de faire un tel téléchargement dans MVC?
EDIT: J'ai obtenu la réponse (ci-dessous), mais je pensais juste que je devrais publier le code de travail complet si quelqu'un d'autre est intéressé:
public ActionResult Download(string filePath, string fileName)
{
string fullName = Path.Combine(GetBaseDir(), filePath, fileName);
byte[] fileBytes = GetFile(fullName);
return File(
fileBytes, System.Net.Mime.MediaTypeNames.Application.Octet, fileName);
}
byte[] GetFile(string s)
{
System.IO.FileStream fs = System.IO.File.OpenRead(s);
byte[] data = new byte[fs.Length];
int br = fs.Read(data, 0, data.Length);
if (br != fs.Length)
throw new System.IO.IOException(s);
return data;
}
la source
Response.ContentType = MimeMapping.GetMimeMapping(filePath);
, à partir de stackoverflow.com/a/22231074/4573839Réponses:
Vous pouvez simplement spécifier le type MIME générique d'octet-stream:
la source
ReadAllBytes
a été ajouté des années plus tard dans une édition. Pourquoi est-ce ma deuxième réponse la plus votée? Tant pis.non-invocable member "File" cannot be used like a method.
Le framework MVC le supporte nativement. Le contrôleur System.Web.MVC.Controller.File fournit des méthodes pour renvoyer un fichier par nom / flux / tableau .
Par exemple, en utilisant un chemin d'accès virtuel au fichier, vous pouvez effectuer les opérations suivantes.
la source
Si vous utilisez .NET Framework 4.5, vous utilisez alors le MimeMapping.GetMimeMapping (chaîne FileName) pour obtenir le type MIME pour votre fichier. C'est ainsi que je l'ai utilisé dans mon action.
la source
Phil Haack a un bel article où il a créé une classe de résultat d'action de téléchargement de fichier personnalisé. Il vous suffit de spécifier le chemin virtuel du fichier et le nom sous lequel il sera enregistré.
Je l'ai utilisé une fois et voici mon code.
Dans mon exemple, je stockais le chemin physique des fichiers, j'ai donc utilisé cette méthode d'assistance - que j'ai trouvée quelque part dont je ne me souviens pas - pour la convertir en chemin virtuel
Voici la classe complète tirée de l'article de Phill Haack
la source
Server.MapPath(this.VirtualPath)
), donc le consommer directement sans changement est un peu naïf. Vous devez produire une alternative qui acceptePhysicalPath
étant donné que c'est ce qui est finalement requis et que vous stockez. Ce serait beaucoup plus sûr car vous avez supposé que le chemin physique et le chemin relatif seraient les mêmes (à l'exclusion de la racine). Les fichiers de données sont souvent stockés est App_Data. Ce n'est pas accessible en tant que chemin relatif.Merci à Ian Henry !
Si vous avez besoin d'obtenir un fichier de MS SQL Server, voici la solution.
Où AppModel est
EntityFramework
modèle et MyFiles présente la table dans votre base de données. FileData estvarbinary(MAX)
dans la table MyFiles .la source
son simple donne juste votre chemin physique dans directoryPath avec le nom de fichier
la source
la source
if (string.IsNullOrWhiteSpace (fileName)) return Content ("filename not present");
la source
GetFile doit fermer le fichier (ou l'ouvrir dans une utilisation). Ensuite, vous pouvez supprimer le fichier après la conversion en octets - le téléchargement se fera sur ce tampon d'octets.
Donc, dans votre méthode de téléchargement ...
la source