繁体   English   中英

在解决方案文件夹中提供 static pdf 文件 - 在 MVC 管道中,具有不同的路径

[英]Serve static pdf files in solution folder - in MVC pipeline , with different route

在我的一个旧项目中,我们确实有一个名为 XYZ 的 static 内容文件夹,我们将其保存在与根目录相同的位置。

目前我们直接通过 url 像 'siteaddress/XYZ/test.pdf' 或 siteaddress/XYZ/2020/Test1.pdf 来获取 Z437175BA4191210EE004E1D973 文件

现在我们需要在路径中存储一些机密文件。 所以我们计划限制对路径的直接访问,并通过 MVC 管道服务

我们添加了一个处理程序来启用来自文件夹的请求,通过 mvc 管道发送到 go

<add
      name="ManagedPdfExtension"
      path="XYZ/*/*.pdf"
      verb="GET"
      type="System.Web.Handlers.TransferRequestHandler"
      preCondition="integratedMode,runtimeVersionv4.0"
/>
      <add
      name="ManagedPdfInnerFolderExtension"
      path="CommonFiles/*/*.pdf"
      verb="GET"
      type="System.Web.Handlers.TransferRequestHandler"
      preCondition="integratedMode,runtimeVersionv4.0"
/>

还创建了一个方法来返回 controller 中的文件

[HttpGet]
[Route("XYZ/{attachmentName}")]
public ActionResult CommonFiles(string attachmentName)
{
    var path = System.Web.Hosting.HostingEnvironment.MapPath("~/XYZ/"+ attachmentName);
    byte[] fileBytes = System.IO.File.ReadAllBytes(path);
    string fileName = "Test.pdf";

    var cd = new ContentDisposition
    {
        Inline = true,
        FileName = fileName
    };

    Response.Clear();
    Response.AddHeader(CoreConstants.ContentDisposition, cd.ToString());
    Response.AddHeader(CoreConstants.WindowTarget, CoreConstants.WindowTargetBlank);
    Response.BufferOutput = false;
    return File(fileBytes, "application/pdf");
}

此代码适用于直接位于文件夹 XYZ 下的文件

这意味着如果我尝试像 url

正在工作的站点地址/XYZ/test.pdf。

但是对于另一个文件夹中的 pdf,我无法使用现有方法。 由于我们在方法中只定义了单个参数attachmentName名称,因此我无法获取子文件夹下的文件。

有没有办法在 MVC 中做同样的事情?

由于某些原因,我无法将所有这些项目移至数据库,更改文件夹结构。 我也无法创建一个映射表

url:密钥并改用密钥。

url 来自一个在许多应用程序中使用的通用表。 所以改变它有点困难。

如果文件夹和子文件夹受到限制,那么我可以处理多条路线。 但是这里的子文件夹编号也可以是一个变量。

实际上来自以下网址

 siteadress/XYZ/abc/bn/test.pdf 
  siteadress/XYZ/abc/cf/bn/test.pdf 
  siteadress/XYZ/abc/bn/test.pdf 

有什么方法可以使它达到一个带有字符串参数的 controller 方法

 abc/bn/test.pdf
abc/cf/bn/test.pdf 
abc/bn/test.pdf 

??

在属性部分添加了带有 * 的路由。

[HttpGet]
        [Route("CommonFiles/{*any}")]
        public ActionResult CommonFiles(string attachmentName)
        {
            var filePathWithName = this.RouteData.Values["any"];
            var path = System.Web.Hosting.HostingEnvironment.MapPath("~/CommonFiles/"+ filePathWithName);
            path = path.Replace("//", "/").Replace("/","//");
            byte[] fileBytes = System.IO.File.ReadAllBytes(path);
            string fileName = "Test.pdf";

            var cd = new ContentDisposition
            {
                Inline = true,
                FileName = fileName
            };

            Response.Clear();
            Response.AddHeader(CoreConstants.ContentDisposition, cd.ToString());
            Response.AddHeader(CoreConstants.WindowTarget, CoreConstants.WindowTargetBlank);
            Response.BufferOutput = false;
            return File(fileBytes, "application/pdf");
        }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM