Saya sudah menyarankan kepada saya bahwa saya harus menggunakan FileResult untuk memungkinkan pengguna mengunduh file dari aplikasi Asp.Net MVC saya. Tapi satu-satunya contoh ini saya dapat temukan selalu ada hubungannya dengan file gambar (menentukan jenis konten gambar / jpeg).
Tetapi bagaimana jika saya tidak dapat mengetahui jenis file? Saya ingin pengguna dapat mengunduh hampir semua file dari file di situs saya.
Saya telah membaca satu metode untuk melakukan ini (lihat posting sebelumnya untuk kode), yang benar-benar berfungsi dengan baik, kecuali untuk satu hal: nama file yang muncul dalam dialog Save As disatukan dari path file dengan garis bawah ( folder_folder_file.ext). Juga, tampaknya orang berpikir saya harus mengembalikan FileResult daripada menggunakan kelas kustom ini yang saya temukan BinaryContentResult.
Adakah yang tahu cara "benar" melakukan pengunduhan di MVC?
EDIT: Saya mendapat jawabannya (di bawah), tetapi hanya berpikir saya harus memposting kode kerja lengkap jika orang lain tertarik:
public ActionResult Download(string filePath, string fileName)
{
string fullName = Path.Combine(GetBaseDir(), filePath, fileName);
byte[] fileBytes = GetFile(fullName);
return File(
fileBytes, System.Net.Mime.MediaTypeNames.Application.Octet, fileName);
}
byte[] GetFile(string s)
{
System.IO.FileStream fs = System.IO.File.OpenRead(s);
byte[] data = new byte[fs.Length];
int br = fs.Read(data, 0, data.Length);
if (br != fs.Length)
throw new System.IO.IOException(s);
return data;
}
sumber
Response.ContentType = MimeMapping.GetMimeMapping(filePath);
, dari stackoverflow.com/a/22231074/4573839Jawaban:
Anda cukup menentukan jenis MIME octet-stream umum:
sumber
ReadAllBytes
ditambahkan bertahun-tahun kemudian dalam edit. Mengapa ini jawaban kedua saya yang paling banyak dipilih? Baiklah.non-invocable member "File" cannot be used like a method.
Kerangka kerja MVC mendukung ini secara asli. The System.Web.MVC.Controller.File controller menyediakan metode untuk kembali file dengan nama / aliran / array yang .
Misalnya menggunakan jalur virtual ke file Anda bisa melakukan hal berikut.
sumber
Jika Anda menggunakan .NET Framework 4.5 maka Anda menggunakan MimeMapping.GetMimeMapping (string FileName) untuk mendapatkan MIME-Type untuk file Anda. Ini adalah bagaimana saya menggunakannya dalam tindakan saya.
sumber
Phil Haack memiliki artikel yang bagus di mana ia menciptakan kelas Hasil Tindakan Unduhan File Khusus. Anda hanya perlu menentukan jalur virtual file dan nama yang akan disimpan.
Saya menggunakannya sekali dan ini kode saya.
Dalam contoh saya, saya menyimpan jalur fisik file jadi saya menggunakan metode pembantu ini - yang saya temukan di suatu tempat yang tidak dapat saya ingat - untuk mengubahnya menjadi jalur virtual
Inilah kelas lengkap yang diambil dari artikel Phill Haack
sumber
Server.MapPath(this.VirtualPath)
) jadi memakan ini secara langsung tanpa perubahan adalah naif. Anda harus menghasilkan alternatif yang menerimaPhysicalPath
mengingat itulah yang akhirnya diperlukan dan apa yang Anda simpan. Ini akan jauh lebih aman karena Anda telah membuat asumsi bahwa jalur fisik dan jalur relatif akan sama (tidak termasuk root). File data yang sering disimpan adalah App_Data. Ini tidak dapat diakses sebagai jalur relatif.Terima kasih kepada Ian Henry !
Dalam hal jika Anda perlu mendapatkan file dari MS SQL Server di sini adalah solusinya.
Di mana AppModel adalah
EntityFramework
model dan MyFiles menyajikan tabel di database Anda. FileData adavarbinary(MAX)
di tabel MyFiles .sumber
sederhana saja berikan path fisik Anda di directoryPath dengan nama file
sumber
sumber
if (string.IsNullOrWhiteSpace (fileName)) mengembalikan Konten ("nama file tidak ada");
sumber
GetFile harus menutup file (atau membukanya dengan menggunakan). Kemudian Anda dapat menghapus file setelah konversi ke byte - unduhan akan dilakukan pada buffer byte itu.
Jadi, dalam metode unduhan Anda ...
sumber