0

目前我正在使用文档管理系统项目技术是 ASP.Net MVC 3 。我想显示位于我硬盘驱动器文件夹中的 pdf 文档(C:,D: E: 等)。我试图<embed>标记。但它没有用。它适用于我项目中的文件。我也不需要下载该pdf并阅读。我需要在我认为的某个地方显示它。

我看到了这个代码段。但我不知道如何使用这个..

public FileResult GetFile(string fileName)
{
    Response.AppendHeader("Content-Disposition", "inline; filename=" + fileName + ";");
    string path = AppDomain.CurrentDomain.BaseDirectory + "App_Data/";            
    return File(path + fileName, System.Net.Mime.MediaTypeNames.Application.Pdf, fileName);
}

有人可以帮我解决这个问题。谢谢你

4

2 回答 2

0

您可能File是 Controller 类的方法。这会将 PDF 返回到浏览器。

public ActionResult GetFile(string fileName)
{
  string fullPathToFile=SomeMethodToGetFullPathFromFileName(fileName);
  return File(fullPathToFile,"application/pdf","someFriendlyName.pdf")
}

假设SomeMethodToGetFullPathFromFileName是一种返回 PDF 文件完整路径的方法

您可以使用Server.MapPath方法来获取文件的完整(物理)路径。

如果您想在浏览器中查看它,您可以像访问它一样访问它

yoursitename/someControllername/getfile?fileName=somepdffilenamehere
于 2012-09-10T17:21:40.790 回答
0

您显示的代码表示从App_Code文件夹中提供文件的控制器操作。从硬盘驱动器上的任意位置提供文件将是一个巨大的安全漏洞。所以我建议你坚持这种方法。但是这段代码仍然存在缺陷。恶意用户仍然可以使用特制的 url 在您的硬盘驱动器上显示任意文件。这可以通过以下操作来解决:

public ActionResult GetFile(string file)
{
    var appData = Server.MapPath("~/App_Data");
    var path = Path.Combine(appData, file);
    path = Path.GetFullPath(path);
    if (!path.StartsWith(appData))
    {
        // Ensure that we are serving file only inside the App_Data folder
        // and block requests outside like "../web.config"
        throw new HttpException(403, "Forbidden");
    }

    if (!System.IO.File.Exists(path))
    {
        return HttpNotFound();
    }

    return File(path, MediaTypeNames.Application.Pdf);
}

现在您可以使用embed标签链接到此控制器操作:

<object data="@Url.Action("GetFile", "SomeController", new { file = "test.pdf" })" type="application/pdf" width="300" height="200">
  alt : @Html.ActionLink("test.pdf", "SomeController", "Home", new { file = "test.pdf" })
</object>

或者,iframe如果您愿意:

<iframe src="@Url.Action("GetFile", "SomeController", new { file = "foo.pdf" })" style="width:718px; height:700px;" frameborder="0"></iframe>
于 2012-09-10T17:26:19.747 回答