ASP.NET MVC में चार फ़ाइल परिणामों के बीच अंतर क्या है


136

ASP.NET के चार अलग-अलग प्रकार के फ़ाइल परिणाम हैं:

  • FileContentResult: प्रतिक्रिया के लिए एक बाइनरी फ़ाइल की सामग्री भेजता है।
  • FilePathResult: प्रतिक्रिया के लिए एक फ़ाइल की सामग्री भेजता है
  • FileResult: प्रतिक्रिया को लिखने के लिए बाइनरी आउटपुट देता है
  • FileStreamResult: एक स्ट्रीम उदाहरण का उपयोग करके प्रतिक्रिया के लिए द्विआधारी सामग्री भेजता है

उन विवरणों को MSDN से लिया जाता है और FileStreamResult के अपवाद के साथ पहले तीन ध्वनि समान हैं। तो उनमें क्या अंतर है?

जवाबों:


176

FileResult अन्य सभी के लिए एक सार आधार वर्ग है।

  • FileContentResult - आप इसका उपयोग तब करते हैं जब आपके पास एक बाइट सरणी होती है जिसे आप एक फ़ाइल के रूप में वापस करना चाहते हैं
  • FilePathResult - जब आपके पास डिस्क पर कोई फ़ाइल होती है और आप इसकी सामग्री वापस करना चाहते हैं (आप एक रास्ता देते हैं)
  • FileStreamResult - आपके पास एक स्ट्रीम खुला है, आप एक फ़ाइल के रूप में इसकी सामग्री वापस करना चाहते हैं

हालांकि, आपको शायद ही कभी इन वर्गों का उपयोग करना होगा - आप बस एक Controller.Fileअधिभार का उपयोग कर सकते हैं और ASP.NET MVC को आपके लिए जादू करने दें।


29

महान सवाल ... और अधिक जानकारी के हकदार हैं। मैं एक दिलचस्प स्थिति के परिणामस्वरूप खुद को यहां पाता हूं। हम MVC3 / C # वातावरण के माध्यम से कुछ पीडीएफ अटैचमेंट दे रहे थे। हमारा कोड जारी हो गया और हमें अपने ग्राहकों से कुछ प्रतिक्रियाएं मिलनी शुरू हो गईं कि जब वे क्रोम का उपयोग कर रहे थे तो डाउनलोड अजीब तरह से व्यवहार कर रहे थे और फ़ाइल प्रकार को 'पीडीएफ-, अटैचमेंट.पीएफडी, अटैचमेंट' में परिवर्तित किया जा रहा था। हाँ ... आप समझ गए ... पूरी बात। तो, कोई इसे सिर्फ 'पीडीएफ' के लिए फिर से लिख सकता है और फ़ाइल अभी भी बरकरार रहेगी, लेकिन क्या गड़बड़ है!

इसलिए, प्रारंभिक स्थिति का वर्णन करने के लिए, हम 'Content-Disposition' हेडर सेट कर रहे थे, फिर एक FileContentResult ...

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

अच्छा लगा। IE में ठीक काम किया। इसलिए मैंने कुछ शोध किया और इसके बजाय FileStreamResult को लागू करने की कोशिश की (सामग्री-विवाद निपटान को ध्यान में रखते हुए):

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

इसने क्रोम में मुद्दा तय किया! हम्म् ... लेकिन क्यों बिल्ली में मुझे अपनी पूरी अच्छी बाइट सरणी लेनी चाहिए और इसे स्ट्रीम करना चाहिए और फिर इसे सही काम करने के लिए फ़ाइल नाम प्राप्त करने के लिए इसके माध्यम से वापस करना चाहिए?

फिर फिडलर आया।

FileContentResult के साथ, मुझे हेडर में 2 कंटेंट-डिस्पोज़िशन मिले हैं। FileStreamResult के साथ, मुझे 1 मिला।

FileContentResult फ़ाइल नाम और क्रोम प्रदान करता है जब एक त्रुटि के रूप में इस हेडर के गुणकों पर विचार करता है जब एक सामग्री-विवाद शीर्षक जोड़ता है।

अजीब प्रतिक्रिया ... लेकिन निश्चित रूप से एक यह जानना अच्छा है।


3
बस एक टिप, .NET 4+ में आप System.Web.MimeMapping.GetMimeMapping(filename)माइम प्रकार को इकट्ठा करने के लिए उपयोग कर सकते हैं यदि आप इसे आसानी से एक्सेस नहीं कर सकते हैं।
गॉनियाल

4
Fileपरिणाम के लिए फ़ाइल नाम प्रदान करने का अर्थ है अपनी FileDownloadNameसंपत्ति सेट करना, जो Content-Dispositionआपके लिए हेडर सेट करता है । और यह सही ढंग से utf-8 फ़ाइल नामों का समर्थन करता है, जो ContentDispositionसहायक वर्ग नहीं करता है ( अधिक विवरण के लिए मेरी टिप्पणी यहां देखें)।
Frédéric

1
हां, धन्यवाद @ Frédéric, आप सभी SO पदों में से अकेले ही मुझे समझाते हैं कि क्या चल रहा था!
नचट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.