Bisakah saya membuat Pengontrol yang hanya mengembalikan aset gambar?
Saya ingin merutekan logika ini melalui pengontrol, setiap kali URL seperti yang berikut ini diminta:
www.mywebsite.com/resource/image/topbanner
Pengontrol akan mencari topbanner.png
dan mengirim gambar itu langsung kembali ke klien.
Saya telah melihat contoh ini di mana Anda harus membuat Tampilan - Saya tidak ingin menggunakan Tampilan. Saya ingin melakukan semuanya hanya dengan Controller.
Apakah ini mungkin?
asp.net
asp.net-mvc
image
controller
Jonathan
sumber
sumber
ApiController class
Jawaban:
Gunakan metode File pengendali dasar.
Sebagai catatan, ini tampaknya cukup efisien. Saya melakukan tes di mana saya meminta gambar melalui controller (
http://localhost/MyController/Image/MyImage
) dan melalui URL langsung (http://localhost/Images/MyImage.jpg
) dan hasilnya adalah:Catatan: ini adalah waktu rata-rata permintaan. Rata-rata dihitung dengan membuat ribuan permintaan pada mesin lokal, sehingga totalnya tidak termasuk latensi jaringan atau masalah bandwidth.
sumber
App_Data
yang harus ditandatangani oleh beberapa pengguna aplikasi Anda tetapi tidak yang lain. Menggunakan tindakan pengontrol untuk melayani mereka memungkinkan Anda untuk membatasi akses./../../../danger/someFileTheyTHoughtWasInaccessible
Menggunakan versi rilis MVC, inilah yang saya lakukan:
Saya jelas memiliki beberapa hal khusus aplikasi di sini mengenai pembangunan jalur, tetapi kembalinya FileStreamResult bagus dan sederhana.
Saya melakukan beberapa pengujian kinerja sehubungan dengan tindakan ini terhadap panggilan sehari-hari Anda ke gambar (melewati controller) dan perbedaan antara rata-rata hanya sekitar 3 milidetik (rata-rata pengontrol adalah 68ms, non-controller adalah 65ms).
Saya telah mencoba beberapa metode lain yang disebutkan dalam jawaban di sini dan kinerja hit jauh lebih dramatis ... beberapa jawaban solusi adalah sebanyak 6x non-controller (pengendali lain rata-rata 340ms, 65ms non-controller).
sumber
Path.Combine
alih-alih concat untuk kode yang lebih aman dan lebih mudah dibaca.Untuk sedikit mengeksploitasi tanggapan Dyland:
Tiga kelas menerapkan kelas FileResult :
Semuanya cukup jelas:
FilePathResult
- ini adalah cara termudah dan menghindari Anda harus menggunakan Streaming.FileContentResult
.FileStreamResult
cara yang mirip dengan di bawah ini, tetapi dengan aMemoryStream
dan menggunakanGetBuffer()
.Streams
penggunaanFileStreamResult
. Ini disebut FileStreamResult tetapi butuhStream
jadi saya kira itu berfungsi dengan aMemoryStream
.Di bawah ini adalah contoh penggunaan teknik konten-disposisi (tidak diuji):
sumber
Ini mungkin berguna jika Anda ingin memodifikasi gambar sebelum mengembalikannya:
sumber
Anda dapat membuat ekstensi sendiri dan melakukannya dengan cara ini.
sumber
Anda dapat menulis langsung ke respons tetapi tidak dapat diuji. Lebih disukai untuk mengembalikan ActionResult yang telah menunda eksekusi. Inilah StreamResult saya yang dapat digunakan kembali:
sumber
Mengapa tidak pergi sederhana dan menggunakan
~
operator tilde ?sumber
UPDATE: Ada opsi yang lebih baik daripada jawaban asli saya. Ini berfungsi di luar MVC dengan cukup baik, tetapi lebih baik menggunakan metode bawaan untuk mengembalikan konten gambar. Lihat jawaban yang dipilih.
Anda tentu bisa. Coba langkah-langkah ini:
Berikut beberapa contoh kode:
Semoga itu bisa membantu!
sumber
Solusi 1: Untuk merender gambar dalam tampilan dari URL gambar
Anda dapat membuat metode ekstensi sendiri:
Kemudian gunakan seperti:
Solusi 2: Untuk merender gambar dari basis data
Buat metode pengontrol yang mengembalikan data gambar seperti di bawah ini
Dan gunakan dalam tampilan seperti:
Untuk menggunakan gambar yang dihasilkan dari tindakan ini menghasilkan HTML apa pun, gunakan
sumber
Ini berhasil untuk saya. Karena saya menyimpan gambar pada database SQL Server.
Dalam cuplikan di atas
_db.ImageFiles.Find(uuid)
sedang mencari catatan file gambar dalam db (konteks EF). Ini mengembalikan objek FileImage yang hanya kelas kustom yang saya buat untuk model dan kemudian menggunakannya sebagai FileContentResult.sumber
Anda dapat menggunakan File untuk mengembalikan file seperti Lihat, Konten dll
sumber
Lihatlah ContentResult. Ini mengembalikan sebuah string, tetapi dapat digunakan untuk membuat kelas BinaryResult Anda sendiri.
sumber
SomeHelper.EmptyImageResult()
harus kembaliFileResult
dengan gambar yang ada (1x1 transparan, misalnya).Ini adalah cara termudah jika Anda memiliki file yang disimpan di drive lokal. Jika file
byte[]
ataustream
- maka gunakanFileContentResult
atauFileStreamResult
seperti yang disarankan Dylan.sumber
Saya melihat dua opsi:
1) Terapkan IViewEngine Anda sendiri dan tetapkan properti ViewEngine dari Controller yang Anda gunakan untuk ImageViewEngine Anda dengan metode "gambar" yang Anda inginkan.
2) Gunakan tampilan :-). Ubah saja jenis konten, dll.
sumber
Anda bisa menggunakan HttpContext.Response dan langsung menulis konten untuk itu (WriteFile () mungkin bekerja untuk Anda) dan kemudian mengembalikan ContentResult dari tindakan Anda alih-alih ActionResult.
Penafian: Saya belum mencoba ini, ini didasarkan pada melihat API yang tersedia. :-)
sumber
Kode di bawah ini digunakan
System.Drawing.Bitmap
untuk memuat gambar.sumber
Saya juga menemui persyaratan serupa,
Jadi dalam kasus saya, saya membuat permintaan ke Controller dengan path folder gambar, yang pada gilirannya mengirimkan kembali objek ImageResult.
Cuplikan kode berikut menggambarkan pekerjaan:
Dan di Controller dari jalur gambar saya menghasilkan gambar dan mengembalikannya ke pemanggil
sumber
Baca gambar, konversikan ke
byte[]
, lalu kembalikanFile()
dengan tipe konten.Berikut adalah usings:
sumber