मैं ASP.NET MVC में उपयोगकर्ता के लिए डेटाबेस में संग्रहीत फ़ाइलों को भेजने में एक समस्या का सामना कर रहा हूं। मैं जो चाहता हूं वह दो लिंक को सूचीबद्ध करने वाला एक दृश्य है, एक फाइल को देखने के लिए और ब्राउज़र को भेजे गए mimetype को यह निर्धारित करने के लिए कि इसे कैसे संभाला जाना चाहिए, और दूसरा डाउनलोड को मजबूर करने के लिए।
यदि मैं नामक फ़ाइल को देखने का विकल्प चुनता हूं SomeRandomFile.bak
और ब्राउज़र के पास इस प्रकार की फ़ाइलों को खोलने के लिए संबद्ध प्रोग्राम नहीं है, तो मुझे डाउनलोड व्यवहार में डिफ़ॉल्ट रूप से कोई समस्या नहीं है। हालाँकि, अगर मैं किसी फ़ाइल को देखने के लिए कहता हूं SomeRandomFile.pdf
या SomeRandomFile.jpg
मैं चाहता हूं कि फ़ाइल बस खुले। लेकिन मैं एक डाउनलोड लिंक को साइड में रखना चाहता हूं ताकि मैं फ़ाइल प्रकार की परवाह किए बिना एक डाउनलोड प्रॉम्प्ट को मजबूर कर सकूं। इसका कोई मतलब भी है क्या?
मैंने कोशिश की है FileStreamResult
और यह अधिकांश फाइलों के लिए काम करता है, इसका निर्माता डिफ़ॉल्ट रूप से फ़ाइल नाम को स्वीकार नहीं करता है, इसलिए अज्ञात फ़ाइलों को URL के आधार पर एक फ़ाइल नाम दिया जाता है (जो सामग्री प्रकार के आधार पर विस्तार देने के लिए नहीं जानता है)। यदि मैं फ़ाइल नाम निर्दिष्ट करके इसे लागू करता हूं, तो मैं ब्राउज़र को सीधे फ़ाइल खोलने की क्षमता खो देता हूं और मुझे डाउनलोड प्रॉम्प्ट मिलता है। क्या किसी और का इससे सामना हुआ है?
मैंने अब तक जो कोशिश की है, उसके ये उदाहरण हैं।
//Gives me a download prompt.
return File(document.Data, document.ContentType, document.Name);
//Opens if it is a known extension type, downloads otherwise (download has bogus name and missing extension)
return new FileStreamResult(new MemoryStream(document.Data), document.ContentType);
//Gives me a download prompt (lose the ability to open by default if known type)
return new FileStreamResult(new MemoryStream(document.Data), document.ContentType) {FileDownloadName = document.Name};
कोई सुझाव?
अद्यतन:
यह प्रश्न बहुत से लोगों के साथ एक राग पर प्रहार करता है, इसलिए मुझे लगा कि मैं एक अपडेट पोस्ट करूंगा। अंतर्राष्ट्रीय वर्णों के बारे में Oskar द्वारा जोड़ा गया नीचे दिए गए स्वीकृत उत्तर पर चेतावनी पूरी तरह से मान्य है, और मैंने ContentDisposition
कक्षा का उपयोग करने के कारण इसे कुछ बार मारा है । मैंने इसे ठीक करने के लिए अपने कार्यान्वयन को अपडेट कर दिया है। हालांकि नीचे दिया गया कोड ASP.NET Core (पूर्ण फ्रेमवर्क) ऐप में इस समस्या के मेरे सबसे हाल के अवतार से है, इसलिए इसे पुराने MVC एप्लिकेशन में न्यूनतम बदलाव के साथ काम करना चाहिए क्योंकि मैं System.Net.Http.Headers.ContentDispositionHeaderValue
कक्षा का उपयोग कर रहा हूं ।
using System.Net.Http.Headers;
public IActionResult Download()
{
Document document = ... //Obtain document from database context
//"attachment" means always prompt the user to download
//"inline" means let the browser try and handle it
var cd = new ContentDispositionHeaderValue("attachment")
{
FileNameStar = document.FileName
};
Response.Headers.Add(HeaderNames.ContentDisposition, cd.ToString());
return File(document.Data, document.ContentType);
}
// an entity class for the document in my database
public class Document
{
public string FileName { get; set; }
public string ContentType { get; set; }
public byte[] Data { get; set; }
//Other properties left out for brevity
}