核心代码:
DataSet ds = dBll.GetList( "ID=" + ID); |
string docName = "a.doc" ; //文件名, |
byte [] file = ( byte [])ds.Tables[0].Rows[0][ "FContent" ]; // "FContent"类型为image string Type = checktype(docName); Response.AddHeader( "Content-Disposition" , "attachment;filename=" + HttpUtility.UrlEncode(docName, System.Text.Encoding.UTF8).Replace( "+" , "%20" )); Response.AddHeader( "Content-Length " , file.Length.ToString()); Response.ContentType = Type; Response.BinaryWrite(file); //可以下载二进制文件,如数据库存的image //Response.WriteFile(fliePath);可以下载路径文件 Response.End(); Response.Clear(); /// <summary> /// 根据文件的扩展名来获取对应的“输出流的HTTP MIME“类型 /// </summary> /// <param name="filename"></param> /// <returns></returns> private string checktype( string filename) { string ContentType; switch (filename.Substring(filename.LastIndexOf( "." )).Trim().ToLower()) { case ".asf " : ContentType = "video/x-ms-asf " ; break ; case ".avi " : ContentType = "video/avi " ; break ; case ".doc " : ContentType = "application/msword " ; break ; case ".zip " : ContentType = "application/zip " ; break ; case ".xls " : ContentType = "application/vnd.ms-excel " ; break ; case ".gif " : ContentType = "image/gif " ; break ; case ".jpg " : ContentType = "image/jpeg " ; break ; case "jpeg " : ContentType = "image/jpeg " ; break ; case ".wav " : ContentType = "audio/wav " ; break ; case ".mp3 " : ContentType = "audio/mpeg3 " ; break ; case ".mpg " : ContentType = "video/mpeg " ; break ; case ".mepg " : ContentType = "video/mpeg " ; break ; case ".rtf " : ContentType = "application/rtf " ; break ; case ".html " : ContentType = "text/html " ; break ; case ".htm " : ContentType = "text/html " ; break ; case ".txt " : ContentType = "text/plain " ; break ; default : ContentType = "application/octet-stream " ; break ; } return ContentType; } |
HttpUtility.UrlEncode(docName, System.Text.Encoding.UTF8).Replace("+", "%20"));这个可以解决中文文件名中包含空格的问题,UrlEncode编码后会把文件名中的空格转换中+(+转换为%2b),但是浏览器是不能理 解加号为空格的,所以在浏览器下载得到的文件,空格就变成了加号;
解决办法:UrlEncode 之后, 将 “+” 替换成 “%20″,因为浏览器将%20转换为空格