ASP.NET MVC में देखने/डाउनलोड करने के लिए फ़ाइल लौटाना




asp.net-mvc asp.net-mvc-3 (4)

मुझे ASP.NET MVC में उपयोगकर्ता को डेटाबेस में संग्रहीत फ़ाइलों को भेजने में समस्या आ रही है। मैं जो चाहता हूं वह दो लिंक सूचीबद्ध करने वाला एक दृश्य है, एक फ़ाइल को देखने के लिए और ब्राउज़र को भेजे गए मिमटाइप को यह निर्धारित करने के लिए कि इसे कैसे प्रबंधित किया जाना चाहिए, और दूसरा डाउनलोड को मजबूर करने के लिए।

अगर मैं SomeRandomFile.bak नामक फ़ाइल को देखना SomeRandomFile.bak और ब्राउज़र के पास इस प्रकार की फ़ाइलों को खोलने के लिए कोई संबद्ध प्रोग्राम नहीं है, तो मुझे डाउनलोड व्यवहार में डिफ़ॉल्ट रूप से कोई समस्या नहीं है। हालांकि, अगर मैं SomeRandomFile.pdf या SomeRandomFile.jpg नामक फ़ाइल को देखना चुनता हूं, तो मैं फ़ाइल को बस खोलना चाहता हूं। लेकिन मैं भी एक लिंक को तरफ से बंद रखना चाहता हूं ताकि फ़ाइल प्रकार के बावजूद मैं एक डाउनलोड प्रॉम्प्ट को मजबूर कर सकूं। इसका कोई मतलब भी है क्या?

मैंने FileStreamResult को आजमाया है और यह अधिकांश फ़ाइलों के लिए काम करता है, यह कन्स्ट्रक्टर डिफ़ॉल्ट रूप से फ़ाइल नाम स्वीकार नहीं करता है, इसलिए अज्ञात फ़ाइलों को यूआरएल के आधार पर फ़ाइल नाम असाइन किया जाता है (जो सामग्री प्रकार के आधार पर देने के लिए एक्सटेंशन को नहीं जानता है)। अगर मैं इसे निर्दिष्ट करके फ़ाइल नाम को मजबूर करता हूं, तो मैं ब्राउज़र को सीधे फ़ाइल खोलने की क्षमता खो देता हूं और मुझे एक डाउनलोड प्रॉम्प्ट मिलता है। क्या किसी और का इससे सामना हुआ है।

ये उदाहरण हैं कि मैंने अभी तक क्या प्रयास किया है।

//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};

कोई सुझाव?


FileVirtualPath -> अनुसंधान \ वैश्विक कार्यालय समीक्षा.pdf

public virtual ActionResult GetFile()
{
    return File(FileVirtualPath, "application/force-download", Path.GetFileName(FileVirtualPath));
}

फ़ाइल देखने के लिए (उदाहरण के लिए txt):

return File("~/TextFileInRootDir.txt", MediaTypeNames.Text.Plain);

फ़ाइल डाउनलोड करने के लिए (उदाहरण के लिए txt):

return File("~/TextFileInRootDir.txt", MediaTypeNames.Text.Plain, "TextFile.txt");

नोट: फ़ाइल डाउनलोड करने के लिए हमें fileDownloadName तर्क पास करना होगा


मेरा मानना ​​है कि यह जवाब क्लीनर है, ( https://.com/a/3007668/550975 पर आधारित)

    public ActionResult GetAttachment(long id)
    {
        FileAttachment attachment;
        using (var db = new TheContext())
        {
            attachment = db.FileAttachments.FirstOrDefault(x => x.Id == id);
        }

        return File(attachment.FileData, "application/force-download", Path.GetFileName(attachment.FileName));
    }

डारिन डिमिट्रोव का जवाब सही है। बस एक जोड़ा:

Response.AppendHeader("Content-Disposition", cd.ToString()); यदि आपकी प्रतिक्रिया में पहले से ही "सामग्री-विस्थापन" शीर्षलेख है, तो ब्राउज़र फ़ाइल को प्रतिपादित करने में विफल हो सकता है। उस स्थिति में, आप इसका उपयोग करना चाह सकते हैं:

Response.Headers.Add("Content-Disposition", cd.ToString());






download