বাইটে এইচটিটিপিপोस्টেড ফাইলবেস রূপান্তর করুন []


123

আমার এমভিসি অ্যাপ্লিকেশনটিতে, আমি একটি ফাইল আপলোড করতে নিম্নলিখিত কোড ব্যবহার করছি।

মডেল

 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

ডারিন যেমন বলেছে, আপনি ইনপুট স্ট্রিম থেকে পড়তে পারেন - তবে আমি একসাথে সমস্ত ডেটা উপলব্ধ হওয়ার উপর নির্ভর করা এড়াতে চাই। আপনি যদি নেট 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 ফাইল ব্যবহার করার পরে এটি কাজ করে । কোনও ধারণা কেন :)
ভুডোচিল্ড

2
@ ভুডোচিল্ড: সম্ভবত আপনি যা করছেন তার কিছু সম্ভবত তথ্যটিকে পাঠ্য হিসাবে বিবেচনা করা। তবে কী জানতে আমার আরও কোড দেখতে হবে। আমি আপনাকে আপনার সম্পূর্ণ দৃশ্যের প্রেক্ষিতে আরেকটি প্রশ্ন জিজ্ঞাসা করার পরামর্শ দিচ্ছি।
জন স্কিটি

6
ঠিক আছে এটি আমার পক্ষে কাজ করেছে, কেবল কিছু প্রসঙ্গে - ধন্যবাদ! `চিত্র img = চিত্র.ফ্রিমস্ট্রিম (ফাইল.আইপুট স্ট্রিম); মেমরিস্ট্রিম এমএস = নতুন মেমরিস্ট্রিম (); img.Save (এমএস, ইমেজ ফরম্যাট.জেপিগ); model.SiteLogo = ms.ToArray (); `
VoodooChild

7
আমি সন্ধান করছিলাম যে ইনপুটস্প্রিম অবস্থানটি স্ট্রিমের শেষে ছিল, তাই model.File.InputStream.Position = 0;এটির কাজ করার জন্য আমাকে জনের কোডের আগে লাইনটি যুক্ত করতে হয়েছিল
মনীশ

2
@ উউকিম: আচ্ছা হ্যাঁ, আমরা ইতিমধ্যে একটি ব্যবহারের বিবৃতি পেয়েছি (নির্দেশনা নয়, বিটিডাব্লু) 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
এইচটিটিপিপসটেড ফাইলবেসের জন্য ইনপুট স্ট্রিমটি কি তার সমস্ত ডেটা একক কলে রিডে ফেরত দেওয়ার নিশ্চয়তা দেয় ? যেখানে সম্ভব সেখানে এড়ানো ভাল।
জন স্কিটি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.