कन्वर्ट HttpPostedFileBase बाइट के लिए []


123

मेरे MVC एप्लिकेशन में, मैं एक फ़ाइल अपलोड करने के लिए निम्नलिखित कोड का उपयोग कर रहा हूं।

नमूना

 public HttpPostedFileBase File { get; set; }

राय

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

सब कुछ ठीक काम कर रहा है .. लेकिन मैं परिणाम फ़ील्ड को बाइट में परिवर्तित करने की कोशिश कर रहा हूं []। मैं यह कैसे कर सकता हूं

नियंत्रक

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

जवाबों:


259

जैसा कि डारिन कहते हैं, आप इनपुट स्ट्रीम से पढ़ सकते हैं - लेकिन मैं एक ही बार में उपलब्ध सभी डेटा पर निर्भर होने से बचूंगा। यदि आप .NET 4 का उपयोग कर रहे हैं तो यह सरल है:

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

CopyToयदि आप चाहें तो .NET 3.5 के समकक्ष लिखना काफी आसान है । महत्वपूर्ण हिस्सा यह है कि आप किस से पढ़ते हैं HttpPostedFileBase.InputStream

कुशल प्रयोजनों के लिए आप सकता है यह देखना होगा कि धारा लौटे पहले से ही एक है 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();
}

पहला उदाहरण मेरे लिए .NET4 में काम नहीं किया (दूसरे का प्रयास नहीं किया) - जब मैंने इसे .png या .jpg के साथ आज़माया तो यह काम नहीं किया, हालाँकि जब मैंने .txt फ़ाइल का उपयोग किया था तब यह काम नहीं किया था। । किसी भी विचार क्यों :)
VoodooChild

2
@VoodooChild: संभवतः आप जो कुछ कर रहे हैं वह डेटा को पाठ के रूप में मान रहा है। हालांकि मुझे यह जानने के लिए अधिक कोड देखने की आवश्यकता होगी। मेरा सुझाव है कि आप अपना पूर्ण परिदृश्य देते हुए एक और प्रश्न पूछें।
जॉन स्कीट

6
ठीक है, यह मेरे लिए काम किया, बस कुछ संदर्भ देने के लिए - धन्यवाद! `छवि img = Image.FromStream (file.InputStream); मेमोरीस्ट्रीम एमएस = नया मेमोरीस्ट्रीम (); img.Save (एमएस, ImageFormat.Jpeg); model.SiteLogo = ms.ToArray (); `
वूडूचाइल्ड

7
मुझे पता चल रहा था कि इनपुटस्ट्रीम स्थिति स्ट्रीम के अंत में थी, इसलिए मुझे model.File.InputStream.Position = 0;जॉन के कोड को काम करने से पहले लाइन को जोड़ना पड़ा
मनीष

2
@ यूवेकेम: ठीक है, हमने पहले ही एक स्टेटमेंट (निर्देश नहीं, btw) का उपयोग कर लिया है inputStreamऔर दोनों एक ही वस्तु को संदर्भित करेंगे। आप इसे दो बार क्यों निपटाना चाहेंगे?
जॉन स्कीट

27

आप इसे इनपुट स्ट्रीम से पढ़ सकते हैं:

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

और यदि आप उस फ़ाइल को सीधे डिस्क में सहेजने का इरादा रखते हैं जिसका आप model.File.SaveAsविधि का उपयोग कर सकते हैं । आपको निम्न ब्लॉग पोस्ट उपयोगी लग सकती है।


5
क्या HttpPostedFileBase के लिए InputStream एक ही कॉल में अपने सभी डेटा को वापस पढ़ने की गारंटी है? जहां संभव हो वहां से बचना सबसे अच्छा है।
जॉन स्कीट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.