从LinkBut​​ton下载时文件被破坏

时间:2013-04-01 03:43:04

标签: c# asp.net

在我的ASP代码中,我有一个用于文件上传的LinkBut​​ton:

<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 “)。我哪里出错了?

更新 LinkBut​​ton位于UpdatePanel。

2 个答案:

答案 0 :(得分:3)

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

您的代码会遇到问题,即Response.End()实际上会导致线程中止异常,因此,您应该在捕获的异常中更具体。

<强>更新

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

以下是:https://stackoverflow.com/a/5461736/1373170

答案 1 :(得分:2)

尝试使用此功能,我无耻地从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;
}