In meiner ApiController-Klasse habe ich folgende Methode, um eine vom Server erstellte Datei herunterzuladen.
public HttpResponseMessage Get(int id)
{
try
{
string dir = HttpContext.Current.Server.MapPath("~"); //location of the template file
Stream file = new MemoryStream();
Stream result = _service.GetMyForm(id, dir, file);
if (result == null)
{
return Request.CreateResponse(HttpStatusCode.NotFound);
}
result.Position = 0;
HttpResponseMessage response = new HttpResponseMessage();
response.StatusCode = HttpStatusCode.OK;
response.Content = new StreamContent(result);
return response;
}
catch (IOException)
{
return Request.CreateResponse(HttpStatusCode.InternalServerError);
}
}
Alles funktioniert einwandfrei, außer dass der Standardname für das Herunterladen der Datei die ID ist, sodass der Benutzer möglicherweise jedes Mal beim Speichern als Dialog seinen eigenen Dateinamen eingeben muss. Gibt es eine Möglichkeit, einen Standarddateinamen im obigen Code festzulegen?
c#
asp.net-web-api
Tae-Sung Shin
quelle
quelle
Antworten:
Sie müssen den
Content-Disposition
Header auf Folgendes setzenHttpResponseMessage
:quelle
System.Net.Mime.ContentDisposition
oder verwendenContentDispositionHeaderValue
? Ist einer aktueller und bevorzugter als der andere?ActionResult
, eine fürHttpResponseMessage
ActionResult
für MVCs und eine für WebApisHttpResponseMessage
.BEARBEITEN: Wie in einem Kommentar erwähnt, berücksichtigt meine Antwort keine Zeichen, die wie a maskiert werden müssen
;
. Sie sollten die akzeptierte Antwort von Darin verwenden, wenn Ihr Dateiname ein Semikolon enthalten könnte.Fügen Sie einen Response.AddHeader hinzu, um den Dateinamen festzulegen
Ändern Sie einfach FILE_NAME in den Namen der Datei.
quelle
;
oder etwas anderes mit einer besonderen Bedeutung enthält?Wenn Sie sicherstellen möchten, dass der Dateiname ordnungsgemäß codiert ist, aber auch die WebApi HttpResponseMessage vermeiden möchten, können Sie Folgendes verwenden:
Sie können entweder ContentDisposition oder ContentDispositionHeaderValue verwenden. Wenn Sie ToString für eine der beiden Instanzen aufrufen, werden die Dateinamen für Sie codiert.
quelle
Ich denke, dass dies für Sie hilfreich sein könnte.
quelle
;
oder etwas anderes mit einer besonderen Bedeutung enthält?Sie müssen der Antwort den Header für die Inhaltsdisposition hinzufügen:
quelle
;
oder etwas anderes mit einer besonderen Bedeutung enthält?Wenn Sie ASP.NET Core MVC verwenden, werden die obigen Antworten geringfügig geändert ...
In meiner Aktionsmethode (die zurückgibt
async Task<JsonResult>
) füge ich die Zeile hinzu (irgendwo vor der return-Anweisung):quelle
Dies sollte tun:
quelle
;
oder etwas anderes mit einer besonderen Bedeutung enthält?Hinweis: Die letzte Zeile ist obligatorisch.
Wenn wir keine Access-Control-Expose-Header angegeben haben , erhalten wir keinen Dateinamen in der Benutzeroberfläche.
quelle
In Anbetracht der vorherigen Antworten ist es notwendig, mit globalisierten Zeichen vorsichtig zu sein.
Angenommen, der Name der Datei lautet: " Esdrújula prenda ñame - güena.jpg "
Rohes Ergebnis zum Download: "Esdrújula prenda à ± ame - güena.jpg" [Hässlich]
HtmlEncode-Ergebnis zum Herunterladen: "Esdr & _250; jula prenda & _241; ame - g & _252; ena.jpg" [Ugly]
UrlEncode-Ergebnis zum Herunterladen: " Esdrújula + prenda + ñame + - + güena.jpg " [OK]
Dann müssen Sie fast immer den UrlEncode über dem Dateinamen verwenden . Wenn Sie den Header für die Inhaltsdisposition als direkte Zeichenfolge festlegen, müssen Sie außerdem Surround mit Anführungszeichen sicherstellen , um Probleme mit der Browserkompatibilität zu vermeiden.
oder mit Klassenhilfe:
Die System.Net.Mime. Die ContentDisposition- Klasse kümmert sich um Anführungszeichen.
quelle