HttpPostedFileBase'i bayta [] dönüştür


123

MVC uygulamamda bir dosya yüklemek için aşağıdaki kodu kullanıyorum.

MODEL

 public HttpPostedFileBase File { get; set; }

GÖRÜNÜM

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

Her şey yolunda gidiyor .. Ama sonucu fiel'i bayta [] dönüştürmeye çalışıyorum. Bunu nasıl yapabilirim

KONTROLÖRÜ

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

Yanıtlar:


259

Darin'in dediği gibi, giriş akışından okuyabilirsiniz - ancak tek seferde mevcut olan tüm verilere güvenmekten kaçınırım. .NET 4 kullanıyorsanız, bu basittir:

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

CopyToİsterseniz .NET 3.5'teki eşdeğerini yazmak yeterince kolaydır . Önemli olan, okumanızdır HttpPostedFileBase.InputStream.

Verimli amaçlar için , döndürülen akışın halihazırda a olup olmadığını kontrol edebilirsinizMemoryStream :

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();
}

İlk örnek .NET4'te benim için işe yaramadı (diğerini denemedim) - Bir .png veya .jpg ile denediğimde işe yaramadı, ancak bir .txt dosyası kullandığımda işe yaradı . Herhangi bir fikriniz neden :)
VoodooChild

2
@VoodooChild: Muhtemelen bir şey metin olarak veri davranıyor ne yaptığını içinde. Ne olduğunu bilmek için daha fazla kod görmem gerekiyor. Senaryonuzun tamamını anlatan başka bir soru sormanızı öneririm.
Jon Skeet

6
tamam bu benim için çalıştı, biraz bilgi vermek için - Teşekkürler! `Image img = Image.FromStream (file.InputStream); MemoryStream ms = new MemoryStream (); img.Save (ms, ImageFormat.Jpeg); model.SiteLogo = ms.ToArray (); ``
VoodooChild

7
Giriş akışı konumunun akışın sonunda olduğunu buluyordum, bu yüzden model.File.InputStream.Position = 0;çalışması için Jon'un kodunun önüne satırı eklemem gerekiyordu
Manish

2
@UweKeim: Evet, zaten bir using deyimimiz var (yönerge, btw değil) inputStreamve her ikisi de aynı nesneyi ifade edecek. Neden onu iki kez elden çıkarmak isteyesiniz?
Jon Skeet

27

Giriş akışından okuyabilirsiniz:

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
    }
    ...
}

Ve dosyayı doğrudan diske kaydetmeyi düşünüyorsanız, model.File.SaveAsyöntemi kullanabilirsiniz . Aşağıdaki blog gönderisini faydalı bulabilirsiniz .


5
Bir HttpPostedFileBase için InputStream'in tek bir Read çağrısında tüm verilerini döndürmesi garantili mi? Mümkünse bundan kaçınmak en iyisidir.
Jon Skeet
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.