【问题标题】:Opening a file (doc, pdf) via a button or hyperlink通过按钮或超链接打开文件(doc、pdf)
【发布时间】:2014-09-16 16:21:23
【问题描述】:

我觉得我在这方面已经转了一千圈,它应该比现在简单得多,但基本上我在 asp.net 中使用 C# 有这个简单的简历提交页面。这些文件位于服务器上的一个文件夹中,但是当我尝试执行它时,似乎我找到的每个解决方案都没有任何作用。

以下是我尝试过的一些示例:

string folder = "~/App_Data/Resumes/" + Session["ResumeName"].ToString();
string folder2 = Server.MapPath("~/App_Data/Resumes/" + Session["ResumeName"].ToString());

System.Web.VirtualPathUtility.ToAbsolute(folder);
System.Diagnostics.Process.Start(folder2);

我从没想过从服务器打开文档这么简单的事情会如此困难。难道不能简单地拥有一个文档的链接并在用户单击它时打开它吗?这就是我想要完成的全部。感谢您阅读我的挫败感。

为了澄清,System.Diagnostics.Process.Start(folder2);在本地工作,但不能在 Web 服务器上工作。我希望它可以在 Web 服务器上工作,所以这就是为什么那个已经出来了。我试图让 Web 服务器能够打开该文件,但我认为我对 IIS 的了解不足以实现它。

【问题讨论】:

  • Process.Start 将打开服务器上的文档。您需要使用 HttpHandler(用于 WebForms)或 FileResult (MVC) 将内容返回给客户端。
  • 那么,为了正确起见,您想在客户端打开文件吗?还是在网络服务器上?
  • 我刚刚更新,我正在尝试从 Web 服务器客户端打开文档。因此,例如简历驻留在服务器上,我希望用户在相应的应用程序中打开它们以查看它们 - Word、adobe、记事本等。
  • 打开服务器上的文件对你有什么帮助?例如,如果您在服务器上打开一个 Word 文件,您的用户将无法在他们的客户端计算机上看到它。除非你的意思是你在服务器上处理这些文件?
  • 我的意思不是在服务器上打开,只是文件位于服务器上并且用户被引导到它以在​​他们的机器上打开。

标签: c# asp.net


【解决方案1】:

App_Data 是 ASP.NET 中的受保护文件夹。 IIS 不会将该文件夹中的任何内容直接提供给客户端——您需要构建一个直接提供该文档的处理程序。

这里有一些示例,但它们并不能代表您需要做的所有事情。其他人可以随意添加其他资源。您的处理程序必须打开文件并将其写入输出流:

Using a c# handler to serve up wav files cuts audio short (only a couple of seconds) ASP.net cache ASHX file server-side

【讨论】:

  • App_Data 甚至没有从 Visual Studio 发布到服务器,我只是创建了文件夹,因为路径已经设置为它。在那种情况下它仍然受到保护吗?
  • 是的,在这种情况下,它仅基于文件夹名称。如果您不介意每个人都可以访问这些文档,您只需将文件夹名称更改为非保留文件夹名称,例如 /resumes/。其他保留文件夹名称包括App_codebin 等。直接请求这些文件夹中的文件将被拒绝。
  • 我认为这里的主要问题是 App_Data 问题。我认为很多失败的东西都可以放在普通文件夹中。我刚刚在某处读到 App_Data 是一个默认位置,您可以放置​​应用程序无需权限即可访问的文件。我可能读错了。
  • 您将应用程序与最终用户混淆了。您的应用程序将有权访问,但使用其浏览器的最终用户将无权访问。
【解决方案2】:
  1. 不要使用 App_Data 之类的文件夹来存放可下载的资源。
  2. stackoverflow 上有一个类似的问题,它会给你一个准确的逐步答案 - ASP.NET file download from server

【讨论】:

  • 我不同意#1,因为文件可能很敏感。你可以通过这样的硬性规则。如果您想控制哪些用户可以查看某些文档,App_Data 是在您的应用程序中执行此操作的好方法(例如,不链接到其他服务器)与HttpHandler 一起使用。
【解决方案3】:

根据您的问题标题,如果我理解正确,您想在链接或按钮单击时打开 .doc.pdf。这将在客户端打开相应的文档。

<a id="lnkResume" href="#" runat="server" target="_blank">Download Resume</a>

您可以通过如下代码设置动态简历名称

 string fileName = Session["ResumeName"].ToString();
 lnkResume.HRef = Server.MapPath("~/App_Data/Resumes/" + fileName);

【讨论】:

    猜你喜欢
    • 2015-12-19
    • 1970-01-01
    • 1970-01-01
    • 2016-09-25
    • 1970-01-01
    • 1970-01-01
    • 2012-08-28
    • 2017-07-08
    • 1970-01-01
    相关资源
    最近更新 更多