Saya mengalami masalah pengiriman file yang disimpan dalam database kembali ke pengguna di ASP.NET MVC. Yang saya inginkan adalah tampilan yang mencantumkan dua tautan, satu untuk melihat file dan membiarkan mimetype yang dikirim ke browser menentukan cara penanganannya, dan yang lainnya untuk memaksa unduhan.
Jika saya memilih untuk melihat file yang dipanggil SomeRandomFile.bak
dan browser tidak memiliki program yang terkait untuk membuka file jenis ini, maka saya tidak punya masalah dengan itu default ke perilaku unduhan. Namun, jika saya memilih untuk melihat file yang dipanggil SomeRandomFile.pdf
atau SomeRandomFile.jpg
saya ingin file tersebut terbuka. Tapi saya juga ingin menjaga tautan unduhan agar tidak bisa memaksa permintaan unduhan terlepas dari jenis file. Apakah ini masuk akal?
Saya telah mencoba FileStreamResult
dan berfungsi untuk sebagian besar file, konstruktornya tidak menerima nama file secara default, jadi file yang tidak dikenal diberi nama file berdasarkan URL (yang tidak tahu ekstensi untuk diberikan berdasarkan tipe konten). Jika saya memaksakan nama file dengan menetapkannya, saya kehilangan kemampuan browser untuk membuka file secara langsung dan saya mendapatkan prompt unduhan. Adakah orang lain yang mengalami ini?
Ini adalah contoh dari apa yang saya coba sejauh ini.
//Gives me a download prompt.
return File(document.Data, document.ContentType, document.Name);
//Opens if it is a known extension type, downloads otherwise (download has bogus name and missing extension)
return new FileStreamResult(new MemoryStream(document.Data), document.ContentType);
//Gives me a download prompt (lose the ability to open by default if known type)
return new FileStreamResult(new MemoryStream(document.Data), document.ContentType) {FileDownloadName = document.Name};
Ada saran?
UPDATE:
Pertanyaan-pertanyaan ini tampaknya cocok dengan banyak orang, jadi saya pikir saya akan memposting pembaruan. Peringatan pada jawaban yang diterima di bawah ini yang ditambahkan oleh Oskar mengenai karakter internasional benar-benar valid, dan saya telah memukulnya beberapa kali karena menggunakan ContentDisposition
kelas. Saya telah memperbarui implementasi saya untuk memperbaikinya. Sementara kode di bawah ini berasal dari inkarnasi terbaru saya tentang masalah ini dalam aplikasi ASP.NET Core (Kerangka Penuh), itu harus bekerja dengan perubahan minimal dalam aplikasi MVC lama juga karena saya menggunakan System.Net.Http.Headers.ContentDispositionHeaderValue
kelas.
using System.Net.Http.Headers;
public IActionResult Download()
{
Document document = ... //Obtain document from database context
//"attachment" means always prompt the user to download
//"inline" means let the browser try and handle it
var cd = new ContentDispositionHeaderValue("attachment")
{
FileNameStar = document.FileName
};
Response.Headers.Add(HeaderNames.ContentDisposition, cd.ToString());
return File(document.Data, document.ContentType);
}
// an entity class for the document in my database
public class Document
{
public string FileName { get; set; }
public string ContentType { get; set; }
public byte[] Data { get; set; }
//Other properties left out for brevity
}