如何在asp.net中使用button的onClick事件下载文件?

5

我有一个字符串变量(在C#中),它包含服务器上PDF文件的完整路径(像"~/doc/help.pdf")。

我希望在点击按钮时,此文件将下载到客户端计算机。

我创建了一个按钮,并在C#中设置了onClick事件。现在,我应该编写哪些代码才能实现这一点?


那是一个 ASP 按钮还是只是一个 HTML 按钮? - Krishanu Dey
1
你能发布相关的代码吗? - rae1
这是一个ASP按钮,点击后会触发事件。我希望它能够下载该路径下的文件,但仍停留在同一位置。 - user3167150
我已经添加了服务器端部分。如果您有一个ASP.NET按钮,请告诉我,这样做会更容易。 - pid
6个回答

26

我想你正在寻找类似于这样的东西。

private void Button1_click(object sender, System.EventArgs e)
{
    Response.ContentType = "Application/pdf";
    Response.AppendHeader("Content-Disposition", "attachment; filename=help.pdf");
    Response.TransmitFile(Server.MapPath("~/doc/help.pdf"));
    Response.End();
}

1
嗨,我尝试了一下,但是当我点击按钮时什么也没有发生。 我使用调试器检查了一下,它进入了事件并运行了这些代码行..但是没有开始下载.. (x包含路径) protected void DownloadButton_Click(object sender, EventArgs e) { String x = downfilename.InnerText; Response.ContentType = "Application/pdf"; Response.AppendHeader("Content-Disposition", "attachment; filename=help.pdf"); Response.TransmitFile(Server.MapPath(x)); Response.End(); } - user3167150
尝试移除最后一行 Response.End(); - Krishanu Dey
已经删除了,但仍然没有任何反应。 - user3167150
我创建了一个虚拟的网站。下载它并进行测试。 http://www.fileconvoy.com/dfl.php?id=gffc91f2a48bb8d8099945028054060f5b0cabb889 - Krishanu Dey
2
谢谢!问题是我将按钮放在了UpdatePanel中,而不是将其放在元素外部,现在它可以工作了。谢谢! - user3167150
有没有办法在原始客户端页面上收到下载完成(失败或成功)的通知? - Terry

3

尝试在您的btn_Click上使用以下代码:

Response.Redirect("~/doc/link.pdf");

使用这条线路时,我遇到了一个"不安全的重定向"错误。 - undefined

1
我建议在按钮点击事件代码中加入以下内容,这将为用户提供一个弹出窗口以下载文件。我已经对其进行了全面测试,并在生产代码中使用它。
void btnDownloadFile_Click(object sender, EventArgs e)
{    
    string strLocalFilePath = "~/doc/help.pdf";
    string fileName = "help.pdf";

    Response.Clear();

    Stream iStream = null;

    const int bufferSize = 64 * 1024;

    byte[] buffer = new Byte[bufferSize];

    int length;

    long dataToRead;

    try
    {
        iStream = new FileStream(strLocalFilePath, FileMode.Open, FileAccess.Read, FileShare.Read);
        dataToRead = iStream.Length;
        Response.ContentType = "application/octet-stream";
        Response.AddHeader("Content-Disposition", "attachment; filename=" + fileName);

        while (dataToRead > 0)
        {
            if (Response.IsClientConnected)
            {
                length = iStream.Read(buffer, 0, bufferSize);
                Response.OutputStream.Write(buffer, 0, length);
                Response.Flush();
                buffer = new byte[bufferSize];
                dataToRead = dataToRead - length;
            }
            else
            {
                //prevent infinate loop on disconnect
                dataToRead = -1;
            }
        }
    }
    catch (Exception ex)
    {
        //Your exception handling here
    }
    finally
    {
        if (iStream != null)
        {
            iStream.Close();
        }
        Response.Close();
    }
}

0
 string path;
            string filename = "Page-3" + ".Pdf";
            path = "~/H/Emp/" + filename.ToString();
            Response.ContentType = "image/jpg";
            Response.AddHeader("Content-Disposition", "attachment;filename=\"" + filename.ToString());
            Response.TransmitFile(Server.MapPath(path));
            Response.End();

0

使用 ASP 按钮:

button.OnClientClick = string.Format("javascript:window.location='{0}'", pdfLink);

这背后的逻辑在这里:客户端点击
这样做不会重新加载页面或进行回传(post-back),它只会导航到 PDF,在浏览器中显示。

将按钮的onclick事件设置为此脚本:

onclick="javascript:window.location='/doc/help.pdf'"

创建服务器端的代码如下:
<input type="button" onclick="javascript:window.location='<%=PDFLink %>'" />

其中PDFLink是代码后台中的字符串属性:

public string PDFLink
{
    get
    {
        return "/doc/link.pdf";
    }
}

从这里开始,如果需要的话,从数据库中获取字符串并将其呈现为绝对值应该是微不足道的。


谢谢,但应该在服务器端处理,因为我从数据库获取文件路径。(只是举了一个例子,文件名可能会变化) - user3167150
嗨,'button.OnClientClick'是有效的,但它会在浏览器中打开PDF文件..我想让它下载到电脑上..也许你知道怎么做? - user3167150

-1
Response.ContentType = "Application/pdf";

Response.AppendHeader("Content-Disposition", "attachment; filename=File_Name.pdf");

Response.TransmitFile(Server.MapPath("Folder_Name/File_Name.pdf"));

Response.End();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接