在我的ASP代码中,我有一个用于文件上传的LinkButton:
<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。
答案 0 :(得分:3)
而不是第二个Response.Clear();
将其替换为Response.End();
以刷新缓冲区并将所有数据发送到客户端。
您的代码会遇到问题,即Response.End()
实际上会导致线程中止异常,因此,您应该在捕获的异常中更具体。
<强>更新强>
在您的评论中,您提到这是在UpdatePanel
内运行的。在那种情况下,这不起作用。您必须强制该链接按钮执行常规回发而不是ajax回发。
答案 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;
}