如何在MVC中提供文件而不公开URL



我有一个树查看器,允许用户浏览文件和子目录,当用户到达一个文件时,网站将转到https://website.com/path/subpath/file.pdf。假设我可以识别用户正在查看文件,则会发生以下情况:

  • 控制器将生成一个SAS密钥以从Azure检索文件
  • 控制器将获得一个url:https://myaccount.files.core.windows.net/path/?=accesskey

虽然用户查看此访问密钥没有问题,但它最终会过期,对于用户将页面添加书签,我希望用户不是重定向到Azure路径,而是ASP.NET输出文件,就好像用户仍在https://website.com/path/subpath/file.pdf

所以最终的问题基本上是:

如何在不强制下载和不显示文件路径/url的情况下输出文件?

您可以尝试将文件作为字节数组从存储中读取,并使用File方法从操作方法返回。

public ActionResult View(int id)
{
  // id is a unique id for the file. Use that to get the file from your storage.
  byte[] byteArrayOfFile=GetFileInByteArrayFormatFromId(id);
  return File(byteArrayOfFile,"application/pdf");
}

假设GetFileInByteArrayFormatFromId在从存储/azure读取后返回文件的字节数组版本。您可以考虑在您的环境中缓存一些文件,这样您就不需要每次请求都联系azure来获取它。

如果您可以将文件作为文件流读取,File方法会有一个重载,它也会占用

public ActionResult View(int id)
{
  // id is a unique id for the file. Use that to get the file from your storage.
  FileStream fileStream = GetFileStreamFromId(id);;
  return File(fileStream, "application/pdf","Myfile.pdf");
}

如果您的服务器中有可用的文件(缓存的文件),您可以使用file方法的另一个重载,在该方法中您将传递路径而不是字节数组。

public ActionResult View(int id)
{
  var f = Server.MapPath("~/Content/Downloads/sampleFile.pdf");
  return File(f,"application/pdf");
}

如果浏览器支持显示响应的内容类型,则响应将显示在浏览器中。大多数主流浏览器都支持渲染pdf文件。

File方法还有另一个重载,它采用浏览器的保存/下载对话框将使用的下载文件名,以便用户可以将其保存到本地计算机和/或打开。

public ActionResult View(int id)
{
    var pathToTheFile=Server.MapPath("~/Content/Downloads/sampleFile.pdf");
    return File(pathToTheFile, MimeMapping.GetMimeMapping(pathToTheFile),"Myfile.pdf");
}
public ActionResult ViewFromByteArray(int id)
{
    byte[] byteArrayOfFile=GetFileInByteArrayFormatFromId(id);
    return File(byteArrayOfFile, "application/pdf","Myfile.pdf");
}

这样,用户将从浏览器中获得下载提示。

相关内容

  • 没有找到相关文章

最新更新