Konversi HttpPostedFileBase menjadi byte []

123

Dalam aplikasi MVC saya, saya menggunakan kode berikut untuk mengunggah file.

MODEL

 public HttpPostedFileBase File { get; set; }

MELIHAT

@Html.TextBoxFor(m => m.File, new { type = "file" })

Semuanya bekerja dengan baik .. Tapi saya mencoba untuk mengubah hasil fiel ke byte []. Bagaimana saya bisa melakukan ini

CONTROLLER

 public ActionResult ManagePhotos(ManagePhotos model)
    {
        if (ModelState.IsValid)
        {
            byte[] image = model.File; //Its not working .How can convert this to byte array
        }
     }
Pointer Null
sumber

Jawaban:

259

Seperti yang dikatakan Darin, Anda dapat membaca dari aliran input - tetapi saya akan menghindari mengandalkan semua data yang tersedia dalam sekali jalan. Jika Anda menggunakan .NET 4 ini sederhana:

MemoryStream target = new MemoryStream();
model.File.InputStream.CopyTo(target);
byte[] data = target.ToArray();

Cukup mudah untuk menulis padanan CopyTodi .NET 3.5 jika Anda mau. Bagian yang penting adalah Anda membacaHttpPostedFileBase.InputStream .

Untuk tujuan yang efisien, Anda dapat memeriksa apakah aliran yang dikembalikan sudah menjadi MemoryStream:

byte[] data;
using (Stream inputStream = model.File.InputStream)
{
    MemoryStream memoryStream = inputStream as MemoryStream;
    if (memoryStream == null)
    {
        memoryStream = new MemoryStream();
        inputStream.CopyTo(memoryStream);
    }
    data = memoryStream.ToArray();
}
Jon Skeet
sumber
Contoh pertama tidak berhasil untuk saya di .NET4 (tidak mencoba yang lain) - Tidak berhasil saat saya mencobanya dengan .png atau .jpg, namun berhasil saat saya menggunakan file .txt . Tahu mengapa :)
VoodooChild
2
@VoodooChild: Mungkin sesuatu yang Anda lakukan adalah memperlakukan data sebagai teks. Saya perlu melihat lebih banyak kode untuk mengetahui bagaimana caranya. Saya sarankan Anda mengajukan pertanyaan lain untuk memberikan skenario lengkap Anda.
Jon Skeet
6
ok ini berhasil untuk saya, hanya untuk memberikan beberapa konteks - Terima kasih! `Gambar img = Image.FromStream (file.InputStream); MemoryStream ms = MemoryStream baru (); img.Save (ms, ImageFormat.Jpeg); model.SiteLogo = ms.ToArray (); `
VoodooChild
7
Saya menemukan bahwa posisi inputstream berada di akhir streaming, jadi saya harus menambahkan baris model.File.InputStream.Position = 0;sebelum kode Jon agar berfungsi
Manish
2
@UweKeim: Ya, kami sudah mendapatkan pernyataan menggunakan (bukan direktif, btw) untuk inputStream, dan keduanya akan merujuk ke objek yang sama. Mengapa Anda ingin membuangnya dua kali?
Jon Skeet
27

Anda dapat membacanya dari aliran input:

public ActionResult ManagePhotos(ManagePhotos model)
{
    if (ModelState.IsValid)
    {
        byte[] image = new byte[model.File.ContentLength];
        model.File.InputStream.Read(image, 0, image.Length); 

        // TODO: Do something with the byte array here
    }
    ...
}

Dan jika Anda ingin langsung menyimpan file ke disk Anda bisa menggunakan model.File.SaveAsmetode ini. Anda mungkin menemukan posting blog berikut berguna.

Darin Dimitrov
sumber
5
Apakah InputStream untuk HttpPostedFileBase dijamin mengembalikan semua datanya dalam satu panggilan ke Baca? Sebaiknya hindari itu jika memungkinkan.
Jon Skeet