ASP.NET MVC4大文件下载的问题

ASP.NET MVC4大文件下载的问题,第1张

刚碰到这个问题,下面的代码可以直接拷贝使用。

protected void Page_Load(object sender, EventArgs e)

{

DownFile1(@"D:\常用软件\win7.iso", "win7.iso")

}

private void DownFile1(string filePath, string fileName)

{

ResponseFile(this.Request, this.Response, fileName, filePath, 1024000)

}

// 输出硬盘文袜猜件,提供下载

// 输入参数 _Request: Page.Request对象, _Response: Page.Response对象, _fileName: 下载文件告局型名, _fullPath: 带文件名下载路径, _speed 每秒允许下载的字节数

// 返回是否成功

public static bool ResponseFile(HttpRequest _Request, HttpResponse _Response, string _fileName, string _fullPath, long _speed)

{

try

{

FileStream myFile = new FileStream(_fullPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)

BinaryReader br = new BinaryReader(myFile)

try

{

_Response.AddHeader("Accept-Ranges", "bytes")

_Response.Buffer = false

long fileLength = myFile.Length

long startBytes = 0

int pack = 10240//10K bytes

//int sleep = 200 //每秒5次 即5*10K bytes每秒

int sleep = (int)Math.Floor((double)(1000 * pack / _speed)) + 1

if (_Request.Headers["Range"] != null)

{

_Response.StatusCode = 206

string[] range = _Request.Headers["Range"].Split(new char[] { '=', '腊拦-' })

startBytes = Convert.ToInt64(range[1])

}

_Response.AddHeader("Content-Length", (fileLength - startBytes).ToString())

if (startBytes != 0)

{

_Response.AddHeader("Content-Range", string.Format(" bytes {0}-{1}/{2}", startBytes, fileLength - 1, fileLength))

}

_Response.AddHeader("Connection", "Keep-Alive")

_Response.ContentType = "application/octet-stream"

_Response.AddHeader("Content-Disposition", "attachmentfilename=" + HttpUtility.UrlEncode(_fileName, System.Text.Encoding.UTF8))

br.BaseStream.Seek(startBytes, SeekOrigin.Begin)

int maxCount = (int)Math.Floor((double)((fileLength - startBytes) / pack)) + 1

for (int i = 0i <maxCounti++)

{

if (_Response.IsClientConnected)

{

_Response.BinaryWrite(br.ReadBytes(pack))

Thread.Sleep(sleep)

}

else

{

i = maxCount

}

}

}

catch

{

return false

}

finally

{

br.Close()

myFile.Close()

}

}

catch

{

return false

}

return true

}

exe怎么可能在浏览器里面运行呢。以下内容摘自百度空间

.net中下载文件的方法

一、//TransmitFile实现下载

protected void Button1_Click(object sender, EventArgs e)

{

/*

微软为Response对象提供了一个新的方法TransmitFile来解决使用Response.BinaryWrite

下载超过400mb的文件时导致Aspnet_wp.exe进程回收而无法成功下载的问题。

代码如搭锋灶下:

*/

Response.ContentType = "application/x-zip-compressed"

Response.AddHeader("Content-Disposition", "attachmentfilename=z.zip")

string filename = Server.MapPath("DownLoad/z.zip")

Response.TransmitFile(filename)

}

二、//WriteFile实现下载

protected void Button2_Click(object sender, EventArgs e)

{

/*

using System.IO

*/

string fileName = "asd.txt"//客户端保存的文件名

string filePath = Server.MapPath("DownLoad/aaa.txt")//路径

FileInfo fileInfo = new FileInfo(filePath)

Response.Clear()

Response.ClearContent()

Response.ClearHeaders()

Response.AddHeader("Content-Disposition", "attachmentfilename=" + fileName)

Response.AddHeader("Content-Length", fileInfo.Length.ToString())

Response.AddHeader("Content-Transfer-Encoding", "binary")

Response.ContentType = "application/octet-stream"

Response.ContentEncoding = System.Text.Encoding.GetEncoding("gb2312")

Response.WriteFile(fileInfo.FullName)

Response.Flush()

Response.End()

}

三、 //WriteFile分块下载

protected void Button3_Click(object sender, EventArgs e)

{

string fileName = "aaa.txt"//知扮客户端保存的文件名

string filePath = Server.MapPath("DownLoad/aaa.txt")//路径

System.IO.FileInfo fileInfo = new System.IO.FileInfo(filePath)

if (fileInfo.Exists == true)

{

const long ChunkSize = 102400//100K 每次读取文件基饥,只读取100K,这样可以缓解服务器的压力

byte[] buffer = new byte[ChunkSize]

Response.Clear()

System.IO.FileStream iStream = System.IO.File.OpenRead(filePath)

long dataLengthToRead = iStream.Length//获取下载的文件总大小

Response.ContentType = "application/octet-stream"

Response.AddHeader("Content-Disposition", "attachmentfilename=" + HttpUtility.UrlEncode(fileName))

while (dataLengthToRead >0 &&Response.IsClientConnected)

{

int lengthRead = iStream.Read(buffer, 0, Convert.ToInt32(ChunkSize))//读取的大小

Response.OutputStream.Write(buffer, 0, lengthRead)

Response.Flush()

dataLengthToRead = dataLengthToRead - lengthRead

}

Response.Close()

}

}

四、//流方式下载

protected void Button4_Click(object sender, EventArgs e)

{

string fileName = "aaa.txt"//客户端保存的文件名

string filePath = Server.MapPath("DownLoad/aaa.txt")//路径

//以字符流的形式下载文件

FileStream fs = new FileStream(filePath, FileMode.Open)

byte[] bytes = new byte[(int)fs.Length]

fs.Read(bytes, 0, bytes.Length)

fs.Close()

Response.ContentType = "application/octet-stream"

//通知浏览器下载文件而不是打开

Response.AddHeader("Content-Disposition", "attachmentfilename=" + HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8))

Response.BinaryWrite(bytes)

Response.Flush()

Response.End()

}

//----------------------------------------------------------

public void DownloadFile( System.Web.UI.Page WebForm,String FileNameWhenUserDownload ,String FileBody )

{

WebForm.Response.ClearHeaders()

WebForm.Response.Clear()

WebForm.Response.Expires = 0

WebForm.Response.Buffer = true

WebForm.Response.AddHeader("Accept-Language", "zh-tw")

//'文件名称

WebForm.Response.AddHeader("content-disposition", "attachmentfilename='"+System.Web.HttpUtility.UrlEncode(FileNameWhenUserDownload, System.Text.Encoding.UTF8)+"'")

WebForm.Response.ContentType = "Application/octet-stream"

//'文件内容

WebForm.Response.Write(FileBody)//-----------

WebForm.Response.End()

}

//上面这段代码是下载一个动态产生的文本文件,若这个文件已经存在于服务器端的实体路径,则可以通过下面的函数:

public void DownloadFileByFilePath( System.Web.UI.Page WebForm,String FileNameWhenUserDownload ,String FilePath )

{

WebForm.Response.ClearHeaders()

WebForm.Response.Clear()

WebForm.Response.Expires = 0

WebForm.Response.Buffer = true

WebForm.Response.AddHeader("Accept-Language", "zh-tw")

//文件名称

WebForm.Response.AddHeader("content-disposition", "attachmentfilename='" + System.Web.HttpUtility.UrlEncode(FileNameWhenUserDownload, System.Text.Encoding.UTF8) +"'" )

WebForm.Response.ContentType = "Application/octet-stream"

//文件内容

WebForm.Response.Write(System.IO.File.Rea}dAllBytes(FilePath))//---------

WebForm.Response.End()


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

原文地址: http://outofmemory.cn/tougao/12263616.html

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

发表评论

登录后才能评论

评论列表(0条)

保存