一个关于asp.net(c#)下载文件的问题

一个关于asp.net(c#)下载文件的问题,第1张

文件路径是不是有中文啊?zh-tw 这是繁体的!

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()


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/tougao/12161333.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存