2016-11-20 4 views
1

gefunden Ich habe eine Aktion, die die Datei dient:Datei nicht mit Datei Ergebnis

public ActionResult() GetFile 
{ 
    return this.File("C:\\test.txt", "text/plain", 
       "test.txt"); 
} 

Aber Aktion verursacht einen Fehler:

FileNotFoundException: Could not find file: C:\test.txt Microsoft.AspNetCore.Mvc.Internal.VirtualFileResultExecutor+d__4.MoveNext()

Ich bin sicher, dass Datei exstis - es über geöffnet werden kann "Run" -Fenster (Win + R). Warum asp.net core mvc die Datei nicht "sieht"?

Antwort

4

Die File() Überlastung, die eine string akzeptiert, definiert als:

public virtual VirtualFileResult File(string virtualPath, string contentType) 

Wie Sie den Namen des Parameters sehen können, virtualPath ist. Das bedeutet, dass Sie einen virtuellen Pfad an die Datei übergeben müssen, keinen physischen Pfad.

(Virtual Pfad bedeutet, einen Weg, der auf die aktuelle Anwendung ist relativ. Zum Beispiel:. ~/Content/test.txt, wo ~ das Stammverzeichnis der Anwendung bezeichnet)

Wenn Sie eine physische Datei sind Beharren auf dient, die über Ihre

var physicalFilePath = "C:\\test.txt"; 
var fileBytes = System.IO.File.ReadAllBytes(physicalFilePath); 

return this.File(fileBytes, "text/plain", "test.txt"); 

Update:: Anwendungsstamm, können Sie es vorher und übergeben das tatsächliche Bytes an die entsprechenden File() Überlastung lesen

Tatsächlich bietet der Basiscontroller eine PhysicalFile()-Methode, die verwendet werden kann, um eine Datei mit einem physischen Pfad zu bedienen. In Ihrem Fall:

return PhysicalFile("C:\\test.txt", "text/plain", "test.txt"); 

Sie sollten auch bedenken, dass (in der Regel) das Verfahren unter dem Ihre Anwendung ausgeführt wird, wird nicht ausreichen, um Berechtigungen aus der Wurzel von C:\ zu lesen.

Siehe Source

+0

Danke - PhysicalFile ist das, was ich suchte. Wie auch immer - seltsame Ausnahme. Mehr bedeutungsvolle Nachricht (zB gegebener Pfad ist nicht virtuell) könnte hilfreich sein :) – pwas

Verwandte Themen