W mojej klasie ApiController mam następującą metodę pobierania pliku utworzonego przez serwer.
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);
}
}
Wszystko działa idealnie, z wyjątkiem tego, że domyślną nazwą pliku do pobrania jest jego identyfikator, więc użytkownik może być zmuszony do wpisania własnej nazwy pliku przy zapisywaniu jako okno dialogowe za każdym razem. Czy istnieje sposób, aby ustawić domyślną nazwę pliku w powyższym kodzie?
c#
asp.net-web-api
Tae-Sung Shin
źródło
źródło
Odpowiedzi:
Musisz ustawić
Content-Disposition
nagłówek naHttpResponseMessage
:źródło
System.Net.Mime.ContentDisposition
czyContentDispositionHeaderValue
? Czy jeden jest bardziej aktualny i preferowany niż drugi?ActionResult
, jedna zaHttpResponseMessage
ActionResult
, a drugi dla WebApiHttpResponseMessage
.EDYCJA: Jak wspomniano w komentarzu, w mojej odpowiedzi nie uwzględniono znaków, którym należy uciec, takich jak
;
. Powinieneś użyć zaakceptowanej odpowiedzi, której udzielił Darin, jeśli nazwa twojego pliku może zawierać średnik.Dodaj Response.AddHeader, aby ustawić nazwę pliku
Po prostu zmień FILE_NAME na nazwę pliku.
źródło
;
lub coś innego o specjalnym znaczeniu?Jeśli chcesz upewnić się, że nazwa pliku jest poprawnie zakodowana, ale jednocześnie uniknąć WebApi HttpResponseMessage, możesz użyć następującego:
Możesz użyć ContentDisposition lub ContentDispositionHeaderValue. Wywołanie ToString na wystąpieniu albo wykona kodowanie nazw plików za Ciebie.
źródło
Myślę, że może ci to pomóc.
źródło
;
lub coś innego o specjalnym znaczeniu?Musisz dodać nagłówek dyspozycji do odpowiedzi:
źródło
;
lub coś innego o specjalnym znaczeniu?Jeśli używasz ASP.NET Core MVC, powyższe odpowiedzi są zawsze tak nieznacznie zmienione ...
W mojej metodzie akcji (która zwraca
async Task<JsonResult>
) dodaję wiersz (w dowolnym miejscu przed instrukcją return):źródło
To powinno wystarczyć:
źródło
;
lub coś innego o specjalnym znaczeniu?Uwaga: ostatnia linia jest obowiązkowa.
Jeśli nie określimy Access-Control-Expose-Headers , nie otrzymamy nazwy pliku w interfejsie użytkownika.
źródło
Biorąc pod uwagę poprzednie odpowiedzi, należy uważać na zglobalizowane postacie.
Załóżmy, że nazwa pliku to: „ Esdrújula prenda ñame - güena.jpg ”
Nieprzetworzony wynik do pobrania: „EsdrĂşjula prenda Ă ± ame - gĂ¼ena.jpg” [Brzydki]
Wynik HtmlEncode do pobrania: „Esdr & _250; jula prenda & _241; ame - g & _252; ena.jpg” [Brzydki]
UrlEncode wynik do pobrania: „ Esdrújula + prenda + ñame + - + güena.jpg ” [OK]
Następnie prawie zawsze musisz użyć UrlEncode zamiast nazwy pliku . Co więcej, jeśli ustawisz nagłówek dyspozycji zawartości jako ciąg bezpośredni, musisz zapewnić otoczenie w cudzysłowie, aby uniknąć problemów ze zgodnością przeglądarki.
lub z pomocą klasową:
Plik System.Net.Mime. Klasa ContentDisposition obsługuje cudzysłowy.
źródło