2

在我的 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 ”)。我哪里做错了?

更新 链接按钮位于更新面板下。

4

2 回答 2

3

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

但是,您的代码会出现问题,也就是说,这Response.End()实际上会导致线程中止异常,因此,您应该更具体地捕获捕获的异常。

更新:

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

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

于 2013-04-01T06:05:03.550 回答
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;
}
于 2013-04-01T05:23:36.100 回答