Di kelas ApiController saya, saya memiliki metode berikut untuk mengunduh file yang dibuat oleh server.
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);
}
}
Semuanya berfungsi dengan baik kecuali bahwa nama file unduhan default adalah id sehingga pengguna mungkin harus mengetikkan nama file sendiri di save as dialog setiap kali. Apakah ada cara untuk menetapkan nama file default dalam kode di atas?
c#
asp.net-web-api
Tae-Sung Shin
sumber
sumber
Jawaban:
Anda perlu mengatur
Content-Disposition
tajuk padaHttpResponseMessage
:sumber
System.Net.Mime.ContentDisposition
atauContentDispositionHeaderValue
? Apakah yang satu lebih terkini dan lebih disukai daripada yang lain?ActionResult
, satu untukHttpResponseMessage
ActionResult
, dan satu untuk WebApiHttpResponseMessage
.EDIT: Seperti yang disebutkan dalam komentar, Jawaban saya tidak memperhitungkan karakter yang perlu melarikan diri seperti a
;
. Anda harus menggunakan jawaban yang diterima yang dibuat oleh Darin jika nama file Anda dapat berisi tanda titik dua.Tambahkan Response.AddHeader untuk mengatur nama file
Ubah saja FILE_NAME ke nama file.
sumber
;
atau sesuatu yang lain dengan makna khusus?Jika Anda ingin memastikan bahwa nama file dikodekan dengan benar tetapi juga menghindari WebApi HttpResponseMessage Anda dapat menggunakan yang berikut ini:
Anda dapat menggunakan ContentDisposition atau ContentDispositionHeaderValue. Memanggil ToString pada instance dari keduanya akan melakukan pengodean nama file untuk Anda.
sumber
Saya pikir ini mungkin membantu Anda.
sumber
;
atau sesuatu yang lain dengan makna khusus?Anda perlu menambahkan header disposisi konten ke respons:
sumber
;
atau sesuatu yang lain dengan makna khusus?Jika Anda menggunakan ASP.NET Core MVC, jawaban di atas sedikit berubah ...
Dalam metode tindakan saya (yang mengembalikan
async Task<JsonResult>
) saya menambahkan baris (di mana saja sebelum pernyataan pengembalian):sumber
Ini harus dilakukan:
sumber
;
atau sesuatu yang lain dengan makna khusus?Catatan: Baris terakhir adalah wajib.
Jika kami tidak menentukan Access-Control-Expose-Header , kami tidak akan mendapatkan Nama File di UI.
sumber
Mempertimbangkan jawaban sebelumnya, perlu berhati-hati dengan karakter yang terglobalisasi.
Misalkan nama file tersebut adalah: " Esdrújula prenda ñame - güena.jpg "
Hasil mentah untuk diunduh: "Esra jula prenda à ± ame - güena.jpg" [Jelek]
HtmlEncode hasil unduhan: "Esdr & _250; jula prenda & _241; ame - g & _252; ena.jpg" [Jelek]
Hasil urlEncode untuk diunduh: " Esdrújula + prenda + ñame + - + güena.jpg " [OK]
Kemudian, Anda hampir selalu perlu menggunakan UrlEncode di atas nama file . Selain itu, jika Anda mengatur header disposisi konten sebagai string langsung, maka Anda perlu memastikan surround dengan tanda kutip untuk menghindari masalah kompatibilitas browser.
atau dengan bantuan kelas:
System.Net.Mime. Kelas ContentDisposition menangani penawaran.
sumber