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




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

मुझे 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};

कोई सुझाव?


मेरा मानना ​​है कि यह जवाब क्लीनर है, ( 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));
    }

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

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

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

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

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


public ActionResult Download()
{
    var document = ...
    var cd = new System.Net.Mime.ContentDisposition
    {
        // for example foo.bak
        FileName = document.FileName, 

        // always prompt the user for downloading, set to true if you want 
        // the browser to try to show the file inline
        Inline = false, 
    };
    Response.AppendHeader("Content-Disposition", cd.ToString());
    return File(document.Data, document.ContentType);
}

नोट: उपरोक्त यह उदाहरण कोड फ़ाइल नाम में अंतरराष्ट्रीय वर्णों के लिए उचित रूप से खाता खोलने में विफल रहता है। प्रासंगिक मानकीकरण के लिए आरएफसी 6266 देखें। मेरा मानना ​​है कि ContentDispositionHeaderValue . ContentDispositionHeaderValue एमवीसी की File() विधि के हाल के संस्करण और ContentDispositionHeaderValue क्लास इसके लिए ठीक से खाते हैं। - ओस्कर 2016-02-25


मुझे "दस्तावेज़" वैरिएबल पर कोई भी संकेत देने के कारण स्वीकार्य उत्तर में परेशानी नहीं थी: var document = ... तो मैं पोस्ट कर रहा हूं कि किसी और को परेशानी होने पर वैकल्पिक के रूप में मेरे लिए क्या काम किया गया है।

public ActionResult DownloadFile()
{
    string filename = "File.pdf";
    string filepath = AppDomain.CurrentDomain.BaseDirectory + "/Path/To/File/" + filename;
    byte[] filedata = System.IO.File.ReadAllBytes(filepath);
    string contentType = MimeMapping.GetMimeMapping(filepath);

    var cd = new System.Net.Mime.ContentDisposition
    {
        FileName = filename,
        Inline = true,
    };

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

    return File(filedata, contentType);
}

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

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

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






download