使用ASP.NET打开服务器上的物理文件

本文关键字:文件 服务器 ASP NET 使用 | 更新日期: 2023-09-27 18:13:41

我想在服务器上通过HyperLink点击打开一个物理文件。

<asp:HyperLink ID="HyButton1" Target="_blank" NavigateUrl='<%#Eval("FullPath") %>' runat="server" Text="Open File" ></asp:HyperLink>

"FullPath"就像"E:'PINCDOCS'Mydoc.pdf"

当前在Chrome中我得到错误。

不允许加载本地资源:

可以这样做吗?或者有其他的解决方案吗?

使用ASP.NET打开服务器上的物理文件

物理文件应该位于IIS网站、虚拟目录或Web应用程序中。因此,您需要创建一个虚拟目录到E:'PINCDOCS。请参阅此处获取说明:http://support.microsoft.com/kb/172138

然后在后面的代码中,您可以使用如下代码:http://geekswithblogs.net/AlsLog/archive/2006/08/03/87032.aspx获取物理文件的Url

//SOURCE
<asp:HyperLink ID="HyButton1" Target="_blank" NavigateUrl='<%#ful_path(Eval("")) %>' runat="server" Text="Open File" ></asp:HyperLink>//ful_path is c# function name
//C#:
protected string ful_path(object ob)
{
    string img = @Request.PhysicalApplicationPath/image/...;
    return img;
}

当您将NavigateUrl设置为FullPath时,Chrome将看到访问该站点的用户机器的本地链接,而不是服务器本身。

所以,你总是需要将任何超链接的URL设置为//someURL或http://someurl

在您的情况下,您必须删除NavigateUrl并添加OnClick处理程序,并且在处理程序中,您将使用FileStream读取文件并将文件内容写入响应流,然后刷新它

点击处理程序的示例:
context.Response.Buffer = false;
context.Response.ContentType = "the file mime type, ex: application/pdf";
string path = "the full path, ex:E:'PINCDOCS";
FileInfo file = new FileInfo(path);
int len = (int)file.Length, bytes;
context.Response.AppendHeader("content-length", len.ToString());
byte[] buffer = new byte[1024];
Stream outStream = context.Response.OutputStream;
using(Stream stream = File.OpenRead(path)) {
    while (len > 0 && (bytes =
        stream.Read(buffer, 0, buffer.Length)) > 0)
    {
        outStream.Write(buffer, 0, bytes);
        len -= bytes;
    }
}