【问题标题】:Show Image in new tab using MVC 4 Actionresult使用 MVC 4 Actionresult 在新选项卡中显示图像
【发布时间】:2016-08-25 16:30:50
【问题描述】:

我已经阅读了很多关于此的文章,但我还没有找到解决方案。

情况很简单:

  • 我有一个图片超链接。
  • 单击后,我希望链接文件在新选项卡中打开。
  • 文件可以是 pdf (application/pdf) 或 Tif (image/tif)。

我可以处理 PDF 文件,但如果文件是 TIF 图像,浏览器想要下载文件而不是在新选项卡中打开。


这是我的控制器代码:

    [Authorize]
    public ActionResult GetFile(string fileName)
    {
        string UploadDirectory = System.Configuration.ConfigurationManager.AppSettings["DealerApplicationFilePath"];
        string fileExtension = Path.GetExtension(fileName);
        string mimeType = "application/unknown";
        switch (fileExtension)
        {
            case ".pdf":
                mimeType = "application/pdf";
                break;
            case ".tif":
                mimeType = "image/tif";
                break;
        }
        var fileStream = new FileStream(UploadDirectory + fileName, FileMode.Open, FileAccess.Read);
        var fsResult = new FileStreamResult(fileStream, mimeType);
        //Response.AppendHeader("Content-Disposition", "inline"); //Content-Disposition doesnt help.
        return fsResult;
    }

这是我的 chtml 代码:

    Html.DevExpress().HyperLink(settingsBtn =>
    {
        settingsBtn.Name = "cb_" + c.KeyValue.ToString();
        settingsBtn.Properties.Target = "_blank";

            switch (Path.GetExtension(DataBinder.Eval(c.DataItem, "FileName").ToString()))
            {
                case ".pdf":
                    settingsBtn.Properties.ImageUrl = "~/Content/GridImages/FileType_PDF.png";
                    break;
                case ".tif":
                    settingsBtn.Properties.ImageUrl = "~/Content/GridImages/FileType_TIF.png";
                    break;
            }

            //This causes a download popup.
            settingsBtn.NavigateUrl = Url.Action("GetFile", "Account", new { fileName = "ATM-311.tif" });

            //This opens in a new tab.
            //settingsBtn.NavigateUrl = Url.Action("GetFile", "Account", new { fileName = "ATM-311.pdf" });
    }).GetHtml();

这是生成的实际 HTML 标记:

<a class="dxeHyperlink_Metropolis" id="cb_311" href="/Account/GetFile?fileName=ATM-311.tif" target="_blank"><img src="/Content/GridImages/FileType_TIF.png" alt=""></a>

任何帮助将不胜感激:)

【问题讨论】:

  • 也许这可以帮助你:stackoverflow.com/a/15789753/4730201
  • 这种行为是否在浏览器中保持一致,还是在某些浏览器的新标签页中打开,而在其他浏览器中却没有?
  • @stephen.vakil - 跨浏览器(即 firefox 和 chrome)是一致的
  • @RicardoPontual - 谢谢里卡多,你的链接帮助。我认为您链接的帖子可能是正确的,因为它假设浏览器无法处理 TIF 文件。至于他们的解决方案(使用内存流并即时转换文件类型),它对我不起作用 TIF 有多个页面,导致 JPG 损坏。

标签: c# asp.net-mvc-4 razor devexpress-mvc


【解决方案1】:

您使用了错误的 mime 类型。对于.tif 文件,应该是image/tiff,而不是image/tif

case ".tif":
            mimeType = "image/tiff";
            break;

您可以通过使用 System.Web 中的 MimeMapping 类来替换容易出错的整个 switch 语句代码(如此错误)。

MineMapping 有一个名为 GetMimeMapping 的方法,它将根据文件扩展名返回正确的 mime 类型。

var fsResult = new FileStreamResult(fileStream, MimeMapping.GetMimeMapping(fileName));

【讨论】:

  • 谢谢@Shyju。我尝试了你的建议,但它们没有任何区别。我用“image/tiff”替换了我的映射,这没有任何区别,然后我尝试使用您删除开关的建议并使用MimeMapping.GetMimeMapping(fileName),这也没有任何区别(尽管仍然是一个很好的建议)
  • 您确定您的 tif 文件有效(未损坏)吗?您可以在图像查看器应用程序中打开它吗?我尝试了代码(使用更新的 mimeType)并能够在新的浏览器选项卡中看到图像。
  • 谢谢@Shyja。该文件有效。看起来这可能是我的浏览器 conf 或 windows 文件映射的问题。它适用于其他图像类型,但不适用于 TIF。如果我公开文件夹并直接链接到文件,它也会导致一个下载窗口,这让我认为这个问题与代码本身无关,而是与浏览器或 Windows 文件映射有关。我将您的答案标记为正确的答案,因为它使我得出了结论:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-25
  • 1970-01-01
  • 1970-01-01
  • 2021-09-26
  • 1970-01-01
  • 1970-01-01
  • 2014-06-21
相关资源
最近更新 更多