从LinkButton下载时文件损坏

本文关键字:文件 损坏 下载 LinkButton | 更新日期: 2023-09-27 18:06:40

在我的ASP代码中,我有一个链接按钮用于我的文件上传:

<asp:Linkbutton ID="lnkContract" Text="" runat="server" Visible="false" onclick="lnkContract_Click"></asp:Linkbutton>

我设法用c#编写代码,触发lnkContract_Click中的文件下载:

protected void lnkContract_Click(object sender, EventArgs e)
{
    string[] strFileType = lnkContract.Text.Split('.');
    string strPath = Server.MapPath("~") + FilePath.CUST_DEALS + lnkContract.Text;
    Open(lnkContract.Text, strFileType[1], strPath);
}

private void Open(string strFile, string strType, string strPath)
{
    FileInfo fiPath = new FileInfo(@strPath);
    //opens download dialog box
    try
    {
        Response.Clear();
        Response.ContentType = "application/" + strType.ToLower();
        Response.AddHeader("Content-Disposition", "attachment; filename='"" + strFile + "'"");
        Response.AddHeader("Content-Length", fiPath.Length.ToString());
        Response.TransmitFile(fiPath.FullName);
        HttpContext.Current.ApplicationInstance.CompleteRequest();
        Response.Clear();
    }//try
    catch
    {
        ucMessage.ShowMessage(UserControl_Message.MessageType.WARN, CustomerDefine.NOFILE);
    }//catch if file is not found
}

当我点击LinkButton文件自动下载,但当我打开文件时,它被打破了(或者如果文件是.jpeg文件显示一个"x")。我哪里做错了?

LinkButton在UpdatePanel下

从LinkButton下载时文件损坏

将第二个Response.Clear();替换为Response.End();以刷新缓冲区并将所有数据发送到客户端。

你的代码会有一个问题,那就是,Response.End()实际上会导致一个线程中止异常,因此,你应该在你捕获的异常中更具体。

更新:

在您的评论中,您提到这是在UpdatePanel中运行的。在这种情况下,这是行不通的。您必须强制该链接按钮执行常规回发,而不是ajax回发。

方法如下:https://stackoverflow.com/a/5461736/1373170

尝试使用我无耻地从http://forums.asp.net/post/3561663.aspx中提取的这个函数来获取内容类型:

(与你的fiPath.Extension一起使用)

public static string GetFileContentType(string fileextension)
{
    //set the default content-type
    const string DEFAULT_CONTENT_TYPE = "application/unknown";
    RegistryKey regkey, fileextkey;
    string filecontenttype;
    //the file extension to lookup
    //fileextension = ".zip";
    try
    {
        //look in HKCR
        regkey = Registry.ClassesRoot;
        //look for extension
        fileextkey = regkey.OpenSubKey(fileextension);
        //retrieve Content Type value
        filecontenttype = fileextkey.GetValue("Content Type", DEFAULT_CONTENT_TYPE).ToString();
        //cleanup
        fileextkey = null;
        regkey = null;
    }
    catch
    {
        filecontenttype = DEFAULT_CONTENT_TYPE;
    }
    //print the content type
    return filecontenttype;
}