6

我有一个树形查看器,允许用户浏览文件和子目录,当用户到达一个文件时,网站将转到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的情况下输出文件?

4

1 回答 1

7

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

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 来获取它。

如果您可以将文件作为文件流读取,则该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");
}

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

于 2015-12-24T18:07:06.423 回答