【问题标题】:Opening a file from a controller url in MVC从 MVC 中的控制器 url 打开文件
【发布时间】:2020-02-07 19:33:57
【问题描述】:

当您单击网站上的链接以打开 pdf 文件时,我需要。当我放置一个指向实际文件的链接并单击该链接时,它会打开文件本身,以便您查看它。当您创建一个读取文件 id 并发送文件的控制器时,它也可以正常工作。问题是客户希望文件直接打开(如链接到实际文件的方法),而不仅仅是自动下载(如控制器方法)

控制器示例(下载文件) href="https://mywebsite.com/Download/DownloadFile?downloadId=17" 链接示例(直接打开文件) href="https://mywebsite.com/pdf/mypdf.pdf"

我已经在多个浏览器和多台计算机上进行了尝试。结果总是一样的。我将文件内容类型设置为 application/pdf。

任何帮助将不胜感激。

【问题讨论】:

    标签: c# asp.net asp.net-mvc pdf


    【解决方案1】:

    您可以为静态文件设置路由。

    步骤:

    1. 在 RouteConfig.cs 中为静态文件启用路由

      routes.RouteExistingFiles = true;
      
    2. 为您的 RouteConfig.cs 路径添加一个路由

      routes.MapRoute(
        name: "staticFileRoute",
        url: "pdf/{*file}",
        defaults: new { controller = "Download", action = "DownloadFile" }
      );
      
    3. 在 Web.config 中添加以下条目

      <system.webServer>
        <handlers>
          <add name="MyCustomUrlHandler2" path="pdf/*" verb="GET" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
        </handlers>
      </system.webServer>
      
    4. 将动作“DownloadFile”添加到“Download”控制器,如下所示:

      public FileResult DownloadFile(string file)
      {
         string path = Server.MapPath(String.Format("~/pdf/{0}", file));
      
         if (System.IO.File.Exists(path))
         {
            string mime = MimeMapping.GetMimeMapping(path);
            return File(path, mime);
         }
         else
              throw new ArgumentException("File not found");
      }
      

    【讨论】:

      【解决方案2】:

      如果您的控制器方法生成文档作为响应,您可以使用Content-Disposition header 向浏览器指定如何打开它。我想你想要的是包含这些标题:

      Content-Disposition: inline; filenname=mypdf.pdf
      Content-Type: application/pdf
      

      这适用于大多数浏览器。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-06-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多