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

时间:2013-05-15 03:03:12

标签: c# asp.net .net hyperlink download

我想在HyperLink上打开服务器上的物理文件。

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

“FullPath”类似于“E:\ PINCDOCS \ Mydoc.pdf”

目前在Chrome中我遇到错误。

  

不允许加载本地资源:

可以这样做或任何其他替代解决方案吗?

4 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

//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;
}

答案 2 :(得分:0)

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

因此,您始终需要将任何hyberlink的网址设为// 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;
    }
}

答案 3 :(得分:0)

源:

<asp:Button id="Button1" Text="open file" OnClick="Button1_Click" runat="server"/>

C#:

//open file using full path:
protected void Button1_Click(object sender, EventArgs e)
{
        System.Diagnostics.Process proc = new System.Diagnostics.Process();
        proc.StartInfo.FileName = @"E:\PINCDOCS\Mydoc.pdf";
        proc.Start();
} 

//open file from your current project:
protected void Button1_Click(object sender, EventArgs e)
{
        System.Diagnostics.Process proc = new System.Diagnostics.Process();
        proc.StartInfo.FileName = HttpContext.Current.Server.MapPath("~/Mydoc.pdf");
        proc.Start();
}