এএসপি.এনইটি এমভিসি-তে চারটি ফাইল ফলাফলের মধ্যে পার্থক্য কী


136

এএসপি.নেটের চারটি ধরণের ফাইলের ফলাফল রয়েছে:

  • ফাইলকন্টেন্টস রেজাল্ট: প্রতিক্রিয়ায় বাইনারি ফাইলের বিষয়বস্তু প্রেরণ করে।
  • ফাইলপ্যাথরিসাল্ট: প্রতিক্রিয়াতে কোনও ফাইলের বিষয়বস্তু প্রেরণ করে
  • ফাইলআরসাল্ট: প্রতিক্রিয়া লিখতে বাইনারি আউটপুট ফেরত দেয়
  • ফাইলস্ট্রিমআরসাল্ট: স্ট্রিম উদাহরণ ব্যবহার করে প্রতিক্রিয়ায় বাইনারি সামগ্রী প্রেরণ করে

এই বিবরণগুলি এমএসডিএন থেকে নেওয়া এবং ফাইল স্ট্রিমআরসাল্ট বাদে প্রথম তিনটি শব্দ অভিন্ন। তাহলে তাদের মধ্যে পার্থক্য কী?

উত্তর:


176

FileResult অন্য সকলের জন্য একটি বিমূর্ত বেস শ্রেণি।

  • FileContentResult - আপনি যখন এটি বাইট অ্যারে রাখবেন আপনি ফাইল হিসাবে ফিরে আসতে চান তা ব্যবহার করুন
  • FilePathResult - যখন আপনার ডিস্কে কোনও ফাইল থাকে এবং এর সামগ্রীটি ফিরে আসতে চান (আপনি একটি পথ দেন)
  • FileStreamResult - আপনার কাছে একটি স্রোত খোলা আছে, আপনি এটির ফাইলটিকে ফাইল হিসাবে ফিরিয়ে দিতে চান

তবে আপনাকে খুব কমই এই ক্লাসগুলি ব্যবহার করতে হবে - আপনি কেবলমাত্র একটি Controller.Fileওভারলোড ব্যবহার করতে পারেন এবং আপনার জন্য এএসপি.নেট এমভিসিটিকে যাদু করতে দিন।


29

দুর্দান্ত প্রশ্ন ... এবং আরও বিশদ প্রাপ্য। আমি এখানে একটি আকর্ষণীয় পরিস্থিতির ফলস্বরূপ নিজেকে খুঁজে পাই। আমরা এমভিসি 3 / সি # পরিবেশের মাধ্যমে কিছু পিডিএফ সংযুক্তি সরবরাহ করছিলাম। আমাদের কোডটি মুক্তি পেয়েছে এবং আমরা আমাদের ক্লায়েন্টদের কাছ থেকে কিছু প্রতিক্রিয়া পেতে শুরু করি যে যখন ডাউনলোডগুলি ক্রোম ব্যবহার করার সময় অদ্ভুত আচরণ করছিল এবং ফাইল টাইপটি 'পিডিএফ-, সংযুক্তি.পিডিএফ-, সংযুক্তি' তে রূপান্তরিত হয়। হ্যাঁ ... আপনি এটি পেয়েছেন ... পুরো জিনিস। সুতরাং, কেউ এটি কেবল 'পিডিএফ' হিসাবে পুনরায় লিখতে পারে এবং ফাইলটি এখনও অক্ষত সংরক্ষণ করতে পারে, তবে কী গোলমাল!

সুতরাং, প্রাথমিক পরিস্থিতি বর্ণনা করতে, আমরা 'বিষয়বস্তু-বিশৃঙ্খলা' শিরোনাম সেট করেছিলাম তারপরে একটি ফাইলসন্টেন্টস রেজাল্ট ফিরিয়ে দিচ্ছি ...

var cd = new System.Net.Mime.ContentDisposition
            {
                FileName = result.Attachment.FileName,
                Inline = false
            };
            Response.AppendHeader("Content-Disposition", cd.ToString());

return File(result.Attachment.Data, MimeExtensionHelper.GetMimeType(result.Attachment.FileName), result.Attachment.FileName);

ভাল লাগছিল। আইই তে কাজ করেছেন। সুতরাং আমি কিছু গবেষণা করেছি এবং পরিবর্তে ফাইলস্ট্রিমআরসাল্ট বাস্তবায়নের চেষ্টা করেছি (বিষয়বস্তু-বিশৃঙ্খলা সেটর রেখে):

MemoryStream dataStream = new MemoryStream();
dataStream.Write(result.Attachment.Data, 0, result.Attachment.Data.Length);
dataStream.Position = 0;
return new FileStreamResult(dataStream, MimeExtensionHelper.GetMimeType(result.Attachment.FileName));

এটি ক্রোমে সমস্যা সমাধান করেছে! হুম ... তবে কেন হ্যাকের জন্য আমাকে আমার পুরো ভাল বাইট অ্যারে নিতে হবে এবং এটিকে প্রবাহিত করতে হবে এবং তারপরে ফাইলটির নামটি সঠিকভাবে কাজ করার জন্য এটি দিয়ে এটি ফিরিয়ে দেওয়া উচিত?

তারপরে ফিদলার এসেছিল।

ফাইলকন্টেন্টআরসাল্টের সাথে, আমি শিরোনামে 2 টি বিষয়বস্তু-বিভাজন পেয়েছি। ফাইল স্ট্রিমারসাল্ট সহ, আমি 1 পেয়েছি।

ফাইলের নাম সরবরাহ করার সময় ফাইল কনটেন্টারসাল্ট একটি সামগ্রী-বিশৃঙ্খলা শিরোনাম সংযোজন করে এবং Chrome এই শিরোনামের গুণকে একটি ত্রুটি হিসাবে বিবেচনা করে।

অদ্ভুত প্রতিক্রিয়া ... তবে অবশ্যই এটি জানা ভাল।


3
নেট 4+ এর মধ্যে একটি টিপ, আপনি System.Web.MimeMapping.GetMimeMapping(filename)সহজেই অ্যাক্সেস করতে না পারলে আপনি মাইম প্রকারটি সংগ্রহ করতে ব্যবহার করতে পারেন।
GONeale

4
কোনও Fileফলাফলের জন্য কোনও ফাইলের নাম প্রদান মানে এর FileDownloadNameসম্পত্তি সেট করা, যা Content-Dispositionআপনার জন্য শিরোনাম সেট করে । এবং এটি সঠিকভাবে utf-8 ফাইলের নাম সমর্থন করে, যা ContentDispositionসহায়ক শ্রেণি দেয় না ( আরও তথ্যের জন্য এখানে আমার মন্তব্য দেখুন)।
ফ্রিডরিক

1
হ্যাঁ, আপনাকে ধন্যবাদ @ ফ্রেডেরিক, আপনি সমস্ত এসও পোস্টের মধ্যে একা আমাকে বুঝিয়ে দিয়েছিলেন যে কী চলছে!
নচট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.