从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下
将第二个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;
}