2016-04-21 5 views
2

Ich habe ein Netzwerklaufwerk, auf das ich über den Controller zugreifen kann. z.B. "\ mydrive \ filestorage". Ich möchte, dass Benutzer Dateien herunterladen können, die auf diesem Server gespeichert sind. Das bedeutet, dass ich keine URL verwenden kann, da diese Dateien außerhalb des Root-Verzeichnisses des Webservers liegen. Es ist mir auch nicht möglich, einen Webserver für dieses Laufwerk einzurichten, ich habe keine andere Möglichkeit, auf diese Daten zuzugreifen, als die Datei mit dem Controller zu lesen und sie auf diese Weise herunterzuladen.Herunterladen einer Datei von einem Remote-Server mit ASP MVC

Ich habe einige Tutorials gefunden, um es für Dateien auf dem Server zu tun, aber ich kann es nicht funktionieren, wenn Sie eine Remote-Datei verwenden. Ich möchte einen Downloadlink haben, Sie klicken darauf und die Datei wird heruntergeladen. Hier ist der Code ich habe

public ActionResult DownloadFile(string id) 
{ 
    UploadedDocument document = new UploadedDocument(Int32.Parse(id)); 
    string filecontents = System.IO.File.ReadAllText(document.FilePath); 
    string filetype = Helpers.GetMimeType(document.FilePath); 
    return File(filecontents, filetype); 
} 

Ich erhalte die folgende Ausnahme

System.IO.DirectoryNotFoundException: Es konnte kein Teil des Weg finden ‚C: \ inetpub \ wwwroot ...

Die Dateipfadvariable ist der Pfad eines Netzlaufwerks.

\\Netdrive\Uploads\somefile.txt 

Die 2 Variablen für Dateiinhalt und Dateityp werden korrekt ausgefüllt. Die Ausnahme wird ausgelöst, wenn die Datei zurückgegeben wird. Wenn ich den Code im Debug-Modus ausführen, werden die 2 Variablen wie folgt ausgefüllt.

filecontents = "test\r\n" 
filetype = "text\plain" 
+0

was ist der Wert von 'document.FilePath'? – Jamiec

+0

Netzwerk Freigaben Pfade beginnt immer mit '\\', nicht mit '\'. Ist das ein Tippfehler? –

+0

gab es 2 Schrägstriche, das Kommentar-Tag entfernte das erste. –

Antwort

3

File(string, string) erwartet einen Dateinamen und einen MIME-Typ, aber Sie den Dateiinhalt als String sind vorbei.

Servieren Sie die Datei direkt von Ihrem Netzlaufwerk, auf diese Weise:

public ActionResult DownloadFile(string id) 
{ 
    UploadedDocument document = new UploadedDocument(Int32.Parse(id)); 
    string filetype = Helpers.GetMimeType(document.FilePath); 
    return File(document.FilePath, filetype); 
} 

die Datei zu erzwingen Download (und umgeht die Browser-Einstellungen Dateihandhabung Standard, zB PDF in Browser angezeigt), fügen Sie einen Dateinamen als drittes Argument der Datei-Methode:

return File(document.FilePath, filetype, "myFileName.pdf"); 
+0

Dies lädt die Datei nicht. Es öffnet die Datei in einem neuen Browserfenster –

+1

Das liegt daran, dass die Datei von Ihrem Browser gehandhabt wird und automatisch entscheidet, wie damit umzugehen ist. Wenn Sie den Download der Datei * forcieren wollen, dann verwenden Sie die Überladung der 'File' Methode mit 3 Strings Argumenten:' return File (document.FilePath, Dateityp, "myFileName.pdf"); ', mit dem letzten Argument als Dateiname. –

+0

das hat den Trick gemacht. Da die andere Antwort als ineffizient gekennzeichnet ist, geben Sie diese als die richtige Antwort an. Danke für die Hilfe –

-1

Bitte unten Code zum Download in MVC die Datei verwenden

public ActionResult Download() 
     { 
      var filepath = @"\\Netdrive\Uploads\somefile.txt"; 
      byte[] filedata = System.IO.File.ReadAllBytes(filepath); 
      string contentType = MimeMapping.GetMimeMapping(filepath); 
      var cd = new System.Net.Mime.ContentDisposition 
      { 
       FileName = filepath, 
       Inline = false, 
      }; 
      Response.AppendHeader("Content-Disposition", cd.ToString()); 
      return File(filedata, contentType); 
     } 
+1

Bitte beachten Sie, dass Sie auf diese Weise den gesamten Dateiinhalt in den Speicher laden und ihn dann wieder in einen Stream verwandeln. Dies ist eine sehr ineffiziente Art, große Dateien zu verarbeiten und unnötigen Speicher zu verschwenden. –

+2

Bitte lösche keinen "fixierten" Code, sondern erkläre, was du geändert hast. – CodeCaster

1

Datei direkt herunterzuladen, können Sie einfach

return File(path of file, System.Net.Mime.MediaTypeNames.Application.Octet, name:file will be download using this name); 

in Controller-Methode

als Beispiel Datei zum Download: http://localhost:60494/Content/Audio/123456.mp3

var audio_path = "/" + path.Substring(path.IndexOf("Content")); 
    String audio_name = path.Substring(path.LastIndexOf("/") + 1); 
    return File(audio_path, System.Net.Mime.MediaTypeNames.Application.Octet, audio_name); 
Verwandte Themen