Ich habe mir vorgeschlagen, FileResult zu verwenden, damit Benutzer Dateien von meiner Asp.Net MVC-Anwendung herunterladen können. Aber die einzigen Beispiele dafür, die ich finden kann, haben immer mit Bilddateien zu tun (Angabe des Inhaltstyps image / jpeg).
Aber was ist, wenn ich den Dateityp nicht kennen kann? Ich möchte, dass Benutzer so gut wie jede Datei aus dem Dateibereich meiner Website herunterladen können.
Ich hatte eine Methode dazu gelesen (siehe einen vorherigen Beitrag für den Code), die tatsächlich gut funktioniert, abgesehen von einer Sache: Der Name der Datei, die im Dialogfeld Speichern unter angezeigt wird, wird aus dem Dateipfad mit Unterstrichen verkettet ( folder_folder_file.ext). Es scheint auch, dass die Leute denken, ich sollte ein FileResult zurückgeben, anstatt diese benutzerdefinierte Klasse zu verwenden, die ich BinaryContentResult gefunden hatte.
Kennt jemand die "richtige" Art, einen solchen Download in MVC durchzuführen?
EDIT: Ich habe die Antwort (unten) erhalten, dachte aber nur, ich sollte den vollständigen Arbeitscode posten, wenn jemand anderes interessiert ist:
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;
}
quelle
Response.ContentType = MimeMapping.GetMimeMapping(filePath);
von stackoverflow.com/a/22231074/4573839Antworten:
Sie können einfach den generischen Octet-Stream-MIME-Typ angeben:
quelle
ReadAllBytes
wurde Jahre später in einer Bearbeitung hinzugefügt. Warum ist dies meine zweithäufigste Antwort? Naja.non-invocable member "File" cannot be used like a method.
Das MVC-Framework unterstützt dies nativ. Der Controller System.Web.MVC.Controller.File bietet Methoden zum Zurückgeben einer Datei nach Name / Stream / Array .
Wenn Sie beispielsweise einen virtuellen Pfad zur Datei verwenden, können Sie Folgendes tun.
quelle
Wenn Sie .NET Framework 4.5 verwenden, verwenden Sie MimeMapping.GetMimeMapping (Zeichenfolge FileName), um den MIME-Typ für Ihre Datei abzurufen. So habe ich es in meiner Aktion verwendet.
quelle
Phil Haack hat einen schönen Artikel, in dem er eine Ergebnisklasse für benutzerdefinierte Dateidownload-Aktionen erstellt hat. Sie müssen nur den virtuellen Pfad der Datei und den Namen angeben, unter dem gespeichert werden soll.
Ich habe es einmal benutzt und hier ist mein Code.
In meinem Beispiel habe ich den physischen Pfad der Dateien gespeichert, also habe ich diese Hilfsmethode verwendet, die ich an einem Ort gefunden habe, an den ich mich nicht erinnern kann, um sie in einen virtuellen Pfad zu konvertieren
Hier ist die ganze Klasse aus Phill Haacks Artikel
quelle
Server.MapPath(this.VirtualPath)
) konvertiert. Daher ist es ein bisschen naiv, dies direkt ohne Änderung zu konsumieren. Sie sollten eine Alternative erstellen, die akzeptiertPhysicalPath
, vorausgesetzt, dass dies letztendlich erforderlich ist und gespeichert wird. Dies wäre viel sicherer, da Sie davon ausgegangen sind, dass der physische Pfad und der relative Pfad identisch sind (ohne die Wurzel). Datendateien werden häufig in App_Data gespeichert. Dies ist als relativer Pfad nicht zugänglich.Vielen Dank an Ian Henry !
Falls Sie eine Datei von MS SQL Server benötigen , finden Sie hier die Lösung.
Wo AppModel ist
EntityFramework
Modell und MyFiles präsentiert Tabelle in der Datenbank. FileData befindet sichvarbinary(MAX)
in der MyFiles- Tabelle.quelle
Geben Sie einfach Ihren physischen Pfad in directoryPath mit dem Dateinamen an
quelle
quelle
if (string.IsNullOrWhiteSpace (fileName)) gibt Content zurück ("Dateiname nicht vorhanden");
quelle
GetFile sollte die Datei schließen (oder innerhalb einer using öffnen). Anschließend können Sie die Datei nach der Konvertierung in Bytes löschen. Der Download erfolgt in diesem Bytepuffer.
Also in Ihrer Download-Methode ...
quelle