ASP.Net MVC: แสดงไฟล์ในเบราว์เซอร์ แสดงชื่อไฟล์ในแท็บเบราว์เซอร์

ในแอปพลิเคชันของฉัน ฉันมีโครงสร้างโฟลเดอร์ที่คุณสามารถอัปโหลดไฟล์ทุกประเภท (jpg, PNG, pdf, txt ฯลฯ) คุณสามารถดาวน์โหลดไฟล์โดยตรงเป็นไฟล์หรือดูไฟล์ในเบราว์เซอร์ก็ได้

ในการแสดงไฟล์ในเบราว์เซอร์ ฉันใช้การกระทำของคอนโทรลเลอร์ดังต่อไปนี้:

    public virtual ActionResult FileDisplay(int fileId, bool isFile)
    {
        var viewmodel = _presenter.GetDocumentDisplayViewModel(fileId, isFile);
        return base.File(viewmodel.Data, viewmodel.MediaType);
    }

ไฟล์จะแสดงในเบราว์เซอร์ดังนี้: https://i.stack.imgur.com/TXmTy.jpg

แท็บเบราว์เซอร์แสดงชื่อคอนโทรลเลอร์ของฉัน "FileDisplay" และ (สำหรับตัวอย่างนี้) ขนาดของรูปภาพ

คำถาม: ฉันจะแสดงชื่อไฟล์ในชื่อแท็บเบราว์เซอร์แทนชื่อคอนโทรลเลอร์ได้อย่างไร สิ่งนี้สำหรับไฟล์ทุกประเภท

1. ส่วนหัวการจัดการเนื้อหา

ฉันพบหลายโพสต์ที่พวกเขาบอกว่าจะเพิ่มส่วนหัว Content-Disposition ในการตอบกลับด้วยชื่อไฟล์:

แต่นี่ไม่ได้ผล

<แข็งแกร่ง>2. เพิ่มชื่อไฟล์ให้กับตัวสร้างไฟล์

return base.File(viewmodel.Data, viewmodel.MediaType, viewmodel.FileName);

หากฉันทำเช่นนี้ ไฟล์จะถูกดาวน์โหลดแทนที่จะแสดงในเบราว์เซอร์

<แข็งแกร่ง>3. ชื่อไฟล์ PDF

ฉันพบว่าบางครั้งชื่อแท็บเบราว์เซอร์ก็ถูกต้อง! หากฉันแสดงไฟล์ PDF ในเบราว์เซอร์ที่มีชื่อไฟล์ (ชื่อในคุณสมบัติ pdf ไม่ใช่ชื่อไฟล์) ชื่อเบราว์เซอร์นั้นถูกต้อง: https://i.stack.imgur.com/orAZSjpg

ใครสามารถช่วยฉันในเรื่องนี้?


person Jim Craane    schedule 14.11.2016    source แหล่งที่มา
comment
ลองเปลี่ยน ViewBag.Title ในหน้า .cshtml ของคุณ   -  person Nitin    schedule 14.11.2016
comment
ไม่มีหน้า .cshtml เมื่อคุณส่งคืนไฟล์โดยตรง   -  person Jim Craane    schedule 14.11.2016
comment
อุ๊ย คุณพูดถูก ฉันไม่เห็นมัน คุณสามารถลองสิ่งนี้ได้ใน ViewBag.Title คอนโทรลเลอร์ของคุณ มันอาจจะได้ผล   -  person Nitin    schedule 14.11.2016


คำตอบ (3)


วิธีแก้ปัญหาตอนนี้:

ฉันได้สร้างการกระทำและดูใหม่ด้วย iframe แบบเต็มหน้าจอ เพื่อให้สามารถตั้งชื่อของมุมมองคอนเทนเนอร์นี้ได้ แหล่งที่มา IFrame กำลังเรียกไฟล์ของฉันโดยตรง

    public virtual ActionResult FileDisplay(string fileName, int fileId, bool isFile)
    {
        var viewModel = new IFrameDocumentDisplayViewModel
        {
            FileName = fileName,
            FileId = fileId,
            IsFile = isFile
        };

        return PartialView("IFrameFileDisplayView", viewModel);
    }

    public virtual ActionResult GetFile(int fileId, bool isFile)
    {
        var viewmodel = _presenter.GetDocumentDisplayViewModel(fileId, isFile);
        return base.File(viewmodel.Data, viewmodel.MediaType);
    }

@model OnView.Models.ViewModels.Document.IFrameDocumentDisplayViewModel

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>@Model.FileName</title>
</head>
<body>
    <iframe style="border: 0; position:absolute; top:0; left:0; right:0; bottom:0; width:100%; height:100%" src="@Html.Raw(Url.Action("GetFile", "Document", new { fileId = Model.FileId, isFile = Model.IsFile}))"></iframe>
</body>
</html>

ตอนนี้ฉันสามารถตั้งชื่อเพจได้แล้ว แต่ฉันยังสงสัยว่าฉันจะทำมันให้สำเร็จได้อย่างไรโดยไม่ต้องใช้ IFrame

person Jim Craane    schedule 14.11.2016
comment
เป็นเรื่องน่าเศร้าที่นี่เป็นวิธีเดียวที่ฉันได้พบในการทำเช่นนี้ หลักทั่วไปคือ หากโซลูชันเกี่ยวข้องกับ IFrame ก็อาจไม่ใช่โซลูชันที่ถูกต้อง - person Rob S.; 31.03.2017

สิ่งที่เบราว์เซอร์แสดงเป็นชื่อแท็บคือส่วนสุดท้ายของ URL (เบราว์เซอร์ไม่ทราบว่าชื่อคอนโทรลเลอร์ของคุณคืออะไร) ดังนั้นคุณจึงสามารถจัดรูปแบบ URL ใหม่ได้ดังนี้:

localhost/OnView.Web/Document/FileDisplay/1685/True/MyTabName

จากนั้นชื่อแท็บจะเป็น MyTabName

แต่การเปลี่ยนสคีมา URL ทั้งหมดเพื่อจุดประสงค์ดังกล่าวก็ดูเหมือนเป็นวิธีแก้ปัญหา...

Sidenote : ฉันมีปัญหาเดียวกัน แต่ URL ของฉันเป็นเช่นนี้ : FileDisplay/3?isFile=true และชื่อแท็บของฉันคือ 3 (ใน Chrome สำหรับ IE ชื่อแท็บคือโดเมน)

person Kraz    schedule 05.01.2018

ลองสิ่งนี้:-

public virtual ActionResult FileDisplay(int fileId, bool isFile)
{
    var viewmodel = _presenter.GetDocumentDisplayViewModel(fileId, isFile);
    ViewBag.Title= viewmodel.FileName;
    return base.File(viewmodel.Data, viewmodel.MediaType);
}
person Nitin    schedule 14.11.2016