2016-07-22 10 views
3

Ich verwende ServiceStack für eine einfache Webanwendung. Der Hauptzweck besteht darin, einem Benutzer das Herunterladen einer Datei zu ermöglichen. Ich verwende eine HttpResult wie folgt:Laden Sie eine Datei mit ServiceStack HttpResult herunter: Wie spezifiziert man einen Dateinamen für heruntergeladene Inhalte?

public class FileDownloadService : Service 
{ 
public object Any() 
{ 
    string fileFullPath = "..."; 
    string mimeType = "application/pdf"; 
    FileInfo fi = new FileInfo(fileFullPath); 

    byte[] reportBytes = File.ReadAllBytes(fi.FullName); 
    result = new HttpResult(reportBytes, mimeType); 

    return result; 
} 
} 

Es öffnet sich ein Dialog, in dem Browser des Benutzers und der Benutzer kann angeben, wo die Datei gespeichert werden. Ein Standardname wird angegeben. Dies ist der Name des RestPath von ServiceStack.

Meine Frage ist: ist es möglich, einen benutzerdefinierten Dateinamen anzugeben, wenn der Benutzer wählt zu speichern (Ändern der Standard)? Ich habe versucht, mit HttpResult Eigenschaften zu arbeiten, aber kein Glück. Vielen Dank im Voraus!

+0

Wenn der Benutzer den "Speichern unter" -Dialog des Browsers öffnet, hat er bereits einen Standarddateinamen geschrieben, das ist der restPath, der in der Routingdatei der Dateiendung ServiceStack + angegeben ist (in meinem Fall "downloadFile.pdf"). weil der Dienst vom "/ downloadFile" Router angesprochen wird. Ich möchte diesen Standardnamen ändern, indem ich ihn beispielsweise in "UserSurname_UserName.pdf" ändere. Ich weiß nicht, ob es möglich ist und wenn ja, wie kann ich dieses Ergebnis erhalten ... – AdrianS

Antwort

3

Sie sollten den Header "Content-Disposition" im HTTP-Ergebnis festlegen. Das erlaubt, den Dateinamen zu setzen:

public object Any() 
{ 
    string fileFullPath = "..."; 
    string mimeType = "application/pdf"; 
    FileInfo fi = new FileInfo(fileFullPath); 

    byte[] reportBytes = File.ReadAllBytes(fi.FullName); 
    result = new HttpResult(reportBytes, mimeType); 

    result.Headers.Add("Content-Disposition", "attachment;filename=YOUR_NAME_HERE.pdf;");  

    return result; 
} 
+0

Vielen Dank! Ich habe meine eigene Lösung geschrieben, während du deine geschrieben hast: Ich möchte sehen, dass sie gleich sind! – AdrianS

+0

Sie können auch einfach 'new HttpResult (fi, asAttachment: true) 'zurückgeben und ServiceStack [füllt die Content-Disposition mit Informationen aus der FileInfo] (https://github.com/ServiceStack/ServiceStack/blob/5021095b8199f45cead3cb3655b8b6e26482927d/src /ServiceStack/HttpResult.cs#L79) automatisch. – mythz

+0

Danke mythz, du hast Recht und das war meine erste Wahl. Aber als die Datei in einen Netzwerkordner gestellt wurde, änderten sich die Dinge, weil der Zugriff auf die Datei verweigert wurde, sogar das Einfügen der HttpResult-Generation in dieselbe "Identitätsbenutzung", die ich zum Lesen der Datei verwendet hatte (ich verwendete die Methoden in [How machst du Identitätswechsel in .NET] (http://stackoverflow.com/questions/125341/how-do-you-do-impersonation-in-net)). Also musste ich den Identitätswechsel verwenden, um den Dateiinhalt vor dem Generieren eines HttpResult abzurufen. – AdrianS

0

Wenn ich Ihre Frage richtig verstanden habe, was Sie wollen, ist der Benutzer möchte die Datei umbenennen. Das hat nichts mit dem Server zu tun. Der Benutzer muss einige Änderungen an dem Browser vornehmen, den er benutzt.

zB Firefox - Extras> Optionen> Allgemein

Dann wird die "fragen mich immer, wo die Dateien speichern" überprüfen

Chrome - Einstellungen> Downloads

dann die „überprüfen fragen, wo jeder speichern Datei vor "

Dann wird es Datei-Browser öffnen, wo zu sparen, können Sie Ihre Dateinamen ändern, was auch immer Ihre

wollte
2

Ich habe die Lösung gefunden. Ich wurde von den Readonly-Eigenschaften des HttpResult getäuscht. Um die Standard-Dateinamen zu ändern, entdeckte ich, dass ich die folgende Zeile hinzufügen müssen, dass die Content-Disposition behandelt:

result.Headers[HttpHeaders.ContentDisposition] = "attachment; filename=\"UserSurname_UserName.pdf\""; 

Vielen Dank für Ihre Zeit!

+0

Sie können auch einfach 'new HttpResult (fi, asAttachment: true)' zurückgeben und es wird automatisch die Information aus 'FileInfo' hinzufügen. – mythz