[Asp.net-mvc] إرجاع ملف إلى عرض / تنزيل في ASP.NET MVC


Answers

واجهت مشكلة في الإجابة المقبولة بسبب عدم التلميح على متغير "المستند": 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);
}
Question

أواجه مشكلة في إرسال الملفات المخزنة في قاعدة بيانات مرة أخرى إلى المستخدم في 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};

أي اقتراحات؟




أعتقد أن هذه الإجابة أكثر نظافة ، (بناءً على 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