2016-08-25 104 views
0

我读过很多关于此的文章,但我还是发现了一个解决方案。使用MVC 4在新选项卡中显示图像ActionResult

的情况很简单:

  • 我有一个形象的超链接。
  • 单击时,我希望链接文件在新选项卡中打开。
  • 该文件可以是pdf(应用程序/ pdf)或Tif(图像/ 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> 

任何帮助,将不胜感激:)

+0

也许这可以帮助你:http://stackoverflow.com/a/15789753/4730201 –

+0

这种行为是一致的跨浏览器或者不打开它在某些浏览器而不是其他的新选项卡? –

+0

@ stephen.vakil - 跨浏览器(即firefox和chrome)是一致的 – Roman

回答

0

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

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

您可以通过使用MimeMapping类,这是在对System.Web的替换整个switch语句代码是容易出错(这样的错误)。

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

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

谢谢@Shyju。我尝试了你的建议,但他们没有任何区别。我用“image/tiff”取代了我的映射,这没有什么区别,然后我试着用你的建议删除开关,并使用'MimeMapping.GetMimeMapping(fileName)',这也没有什么区别(尽管如此,仍然是一个很好的建议) – Roman

+0

你确定你的tif文件是有效的(没有损坏)?你能够在图像查看器应用程序中打开它吗?我尝试了代码(使用更新后的mimeType),并能够在新的浏览器选项卡中看到图像。 – Shyju

+1

谢谢@Shyja。该文件是有效的。它看起来像这可能是我的浏览器conf或windows文件映射的问题。它适用于其他图像类型,但不适用于TIF。如果我暴露文件夹并直接链接到文件,它也会导致下载窗口,这使我认为这个问题与代码本身无关,而与浏览器或Windows文件映射无关。我将你的答案标记为正确答案,因为它使我得出了我的结论:) – Roman