asp.net2.0以后,我们有了很多种贺手文件下载的选择。
public partial class FileDownLoad : System.Web.UI.Page
{
//提供下载的文件,不编码的话文件名会乱码
private string fileName = HttpContext.Current.Server.UrlEncode("规范.rar")
private string filePath = HttpContext.Current.Server.MapPath("规范.rar"册粗)
//使用TransmifFile下载文件
protected void btnDL1_Click(object sender, EventArgs e)
{
FileInfo info = new FileInfo(filePath)
long fileSize = info.Length
Response.Clear()
Response.ContentType = "application/x-zip-compressed"
Response.AddHeader("Content-Disposition", "attachmentfilename="+ fileName)
//不指明Content-Length用Flush的话不会显示下禅姿嫌载进度
Response.AddHeader("Content-Length", fileSize.ToString())
Response.TransmitFile(filePath, 0, fileSize)
Response.Flush()
Response.Close()
}
//使用WriteFile下载文件
protected void btnDL2_Click(object sender, EventArgs e)
{
FileInfo info = new FileInfo(filePath)
long fileSize = info.Length
Response.Clear()
Response.ContentType = "application/octet-stream"
Response.AddHeader("Content-Disposition", "attachementfilename=" + fileName)
//指定文件大小
Response.AddHeader("Content-Length", fileSize.ToString())
Response.WriteFile(filePath, 0, fileSize)
Response.Flush()
Response.Close()
}
//使用OutputStream.Write分块下载文件
protected void btnDL3_Click(object sender, EventArgs e)
{
//指定块大小
long chunkSize = 102400
//建立一个100K的缓冲区
byte[] buffer = new byte[chunkSize]
//已读的字节数
long dataToRead = 0
FileStream stream = null
try
{
//打开文件
stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read)
dataToRead = stream.Length
//添加Http头
Response.ContentType = "application/octet-stream"
Response.AddHeader("Content-Disposition", "attachementfilename=" + fileName)
Response.AddHeader("Content-Length", dataToRead.ToString())
while (dataToRead >0)
{
if (Response.IsClientConnected)
{
int length = stream.Read(buffer, 0, Convert.ToInt32(chunkSize))
Response.OutputStream.Write(buffer, 0, length)
Response.Flush()
Response.Clear()
dataToRead -= length
}
else
{
//防止client失去连接
dataToRead = -1
}
}
}
catch (Exception ex)
{
Response.Write("Error:" + ex.Message)
}
finally
{
if (stream != null)
{
stream.Close()
}
Response.Close()
}
}
//使用BinaryWrite下载文件,大文件效率不行
protected void btnDL4_Click(object sender, EventArgs e)
{
FileStream stream = null
try
{
//读文件,大文件一次读入会占用大量内存
stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read)
byte[] bytes = new byte[stream.Length]
stream.Read(bytes, 0, bytes.Length)
stream.Close()
//添加Http头
Response.ContentType = "application/octet-stream"
Response.AddHeader("Content-Disposition", "attachementfilename=" + fileName)
Response.AddHeader("Content-Length", bytes.Length.ToString())
Response.BinaryWrite(bytes)
Response.Flush()
}
catch (Exception ex)
{
Response.Write("Error:" + ex.Message)
}
finally
{
if (stream != null)
{
stream.Close()
}
Response.Close()
}
}
//使用BinaryWrite分块下载文件
protected void btnDL5_Click(object sender, EventArgs e)
{
//指定区块和缓冲区
long chunkSize = 102400
byte[] buffer = new byte[chunkSize]
FileStream stream = null
long dataToRead = 0
try
{
stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read)
dataToRead = stream.Length
//添加Http头
Response.ContentType = "application/octet-stream"
Response.AddHeader("Content-Disposition", "attachementfilename=" + fileName)
Response.AddHeader("Content-Length", dataToRead.ToString())
while (dataToRead >0)
{
if (Response.IsClientConnected)
{
int length = stream.Read(buffer, 0, Convert.ToInt32(chunkSize))
Response.BinaryWrite(buffer)
Response.Flush()
Response.Clear()
dataToRead -= length
}
else
{
dataToRead = -1
}
}
}
catch(Exception ex)
{
Response.Write("Error:" + ex.Message)
}
finally
{
if (stream != null)
{
stream.Close()
}
Response.Close()
}
}
}
public partial class FileDownLoad : System.Web.UI.Page { //提供下载的文件,不编码的话文件名会乱码 private string fileName = HttpContext.Current.Server.UrlEncode("规范.rar")private string filePath = HttpContext.Current.Server.MapPath("规范.rar")//使用TransmifFile下载文件 protected void btnDL1_Click(object sender, EventArgs e) { FileInfo info = new FileInfo(filePath)long fileSize = info.LengthResponse.Clear()Response.ContentType = "application/x-zip-compressed"Response.AddHeader("Content-Disposition", "attachmentfilename="+ fileName)//不指明Content-Length用Flush的话不会显示下载进度 Response.AddHeader("Content-Length", fileSize.ToString())Response.TransmitFile(filePath, 0, fileSize)Response.Flush()Response.Close()} //使用WriteFile下载文件 protected void btnDL2_Click(object sender, EventArgs e) { FileInfo info = new FileInfo(filePath)long fileSize = info.LengthResponse.Clear()Response.ContentType = "application/octet-stream"Response.AddHeader("Content-Disposition", "attachementfilename=" + fileName)//指定文件大小 Response.AddHeader("Content-Length", fileSize.ToString())Response.WriteFile(filePath, 0, fileSize)Response.Flush()Response.Close()} //使用OutputStream.Write分块下载文件 protected void btnDL3_Click(object sender, EventArgs e) { //指定块大小 long chunkSize = 102400//建立一个100K的缓冲区 byte[] buffer = new byte[chunkSize]//已读的字节数 long dataToRead = 0FileStream stream = nulltry { //打开文件 stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read)dataToRead = stream.Length//添加Http头 Response.ContentType = "application/octet-stream"Response.AddHeader("Content-Disposition", "attachementfilename=" + fileName)Response.AddHeader("Content-Length", dataToRead.ToString())while (dataToRead >0) { if (Response.IsClientConnected) { int length = stream.Read(buffer, 0, Convert.ToInt32(chunkSize))Response.OutputStream.Write(buffer, 0, length)Response.Flush()Response.Clear()dataToRead -= length} else { //防止client失去连接 dataToRead = -1} } } catch (Exception ex) { Response.Write("Error:" + ex.Message)} finally { if (stream != null) { stream.Close()} Response.Close()} } //使用BinaryWrite下载文件,大文件效率不行 protected void btnDL4_Click(object sender, EventArgs e) { FileStream stream = nulltry { //读文件,大文件一次读入会占用大量内存 stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read)byte[] bytes = new byte[stream.Length]stream.Read(bytes, 0, bytes.Length)stream.Close()//添加Http头 Response.ContentType = "application/octet-stream"Response.AddHeader("Content-Disposition", "attachementfilename=" + fileName)Response.AddHeader("Content-Length", bytes.Length.ToString())Response.BinaryWrite(bytes)Response.Flush()} catch (Exception ex) { Response.Write("Error:" + ex.Message)} finally { if (stream != null) { stream.Close()} Response.Close()} } //使用BinaryWrite分块下载文件 protected void btnDL5_Click(object sender, EventArgs e) { //指定区块和缓冲区 long chunkSize = 102400byte[] buffer = new byte[chunkSize]FileStream stream = nulllong dataToRead = 0try { stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read)dataToRead = stream.Length//添加Http头 Response.ContentType = "application/octet-stream"Response.AddHeader("Content-Disposition", "attachementfilename=" + fileName)Response.AddHeader("Content-Length", dataToRead.ToString())while (dataToRead >0) { if (Response.IsClientConnected) { int length = stream.Read(buffer, 0, Convert.ToInt32(chunkSize))Response.BinaryWrite(buffer)Response.Flush()Response.Clear()dataToRead -= length} else { dataToRead = -1} } } catch(Exception ex) { Response.Write("Error:" + ex.Message)} finally { if (stream != null) { stream.Close()} Response.Close()} } }
以上除了第四种不推荐以外,其他的都可以,但是个人感觉分块下载的要好一点。没有仔细测试,所以可能有问题。
注意:对于中文文件名要编码才能正确显示。对于长中文文件名(UTF8编码后大于153字节的中文)即使编码了,还是有问题的,大家可以参考这个链接。
http://hi.baidu.com/river_5566/blog/item/d66804cef8afb031b700c863.html
string filename = context.Request["fileName"].ToString()string fileName = "【下载】" + filename//客户端保存的文件名
string filePath = System.Web.HttpContext.Current.Request.MapPath("~/UpFile/TraceCode/" + filename + "")//路径
则竖 孙培大FileStream fileStream = new FileStream(filePath, FileMode.Open)
byte[] bytes = new byte[(int)fileStream.Length]
fileStream.Read(bytes, 0, bytes.Length)
fileStream.Close()
System.Web.HttpContext.Current.Response.ContentType = "application/octet-stream"
System.Web.HttpContext.Current.Response.AddHeader("Content-Disposition", "attachmentfilename=" + fileName)
System.Web.HttpContext.Current.Response.BinaryWrite(bytes)
System.Web.HttpContext.Current.Response.Flush()
//System.Web.HttpContext.Current.Response.End()
中衡 //System.Web.HttpContext.Current.Response.Close()
System.Web.HttpContext.Current.ApplicationInstance.CompleteRequest()
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)