随笔 - 394  文章 - 0  评论 - 946  阅读 - 143万 

在网站设计过程中,我们常常需要下载一些上传的文件,比如说压缩包,文档,影视资源等等。那么我们就需要一个能够提供下载的功能,当然了 一般的下载功能应该能够提示用户保存或者是打开,在下载过程中能够实时的提示进度和速度,并且提示下载的大小。在下载过程中,能够在出错的时候,进行异常报错。这将是再好不过的了,今天的例子,就调用了系统的下载例子,具体见代码:

复制代码
private bool DownLoadFile()
{
//文件路径 和 文件名称
string filePath = Server.MapPath("~/DownLoad/myFiles");
string downLoadFile = "test.mkv";

FileInfo fileName
= new FileInfo(filePath + "\\" + downLoadFile);
FileStream fileStream
= new FileStream(filePath + "\\" + downLoadFile, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);

//流读取
BinaryReader binaryReader = new BinaryReader(fileStream);

//如果文件存在
if (fileName.Exists)
{
try
{
long startBytes = 0;
string lastUpdateTimeStamp = File.GetLastWriteTimeUtc(filePath).ToString("r");
string encodeData = HttpUtility.UrlEncode(downLoadFile, Encoding.UTF8) + lastUpdateTimeStamp;

//清除response的内容
Response.Clear();
Response.Buffer
= false;
Response.AddHeader(
"Accept-Ranges", "bytes");
Response.AppendHeader(
"ETag", "\"" + encodeData + "\"");
Response.AppendHeader(
"Last-Modified", lastUpdateTimeStamp);

//设置contenttype
Response.ContentType = "application/octet-stream";

//在弹出的对话框中,添加上文件名称和文件大小
Response.AddHeader("Content-Disposition", "attachment;filename=" + fileName.Name);

Response.AddHeader(
"Content-Length", (fileName.Length - startBytes).ToString());
Response.AddHeader(
"Connection", "Keep-Alive");

//设置编码格式
Response.ContentEncoding = Encoding.UTF8;

//发送数据
binaryReader.BaseStream.Seek(startBytes, SeekOrigin.Begin);

//切割数据,以1024字节为一个包
int maxCount = (int)Math.Ceiling((fileName.Length - startBytes + 0.0) / 1024);

//以1024为单位,下载数据
int i;
for (i = 0; i < maxCount && Response.IsClientConnected; i++)
{
Response.BinaryWrite(binaryReader.ReadBytes(
1024));
Response.Flush();
}

//将当前的下载与总文件大小对比,看看是否下载完毕
if (i < maxCount) return false;
return true;
}
catch
{
return false;
}
finally
{
//文件流以及流读取关闭
Response.End();
binaryReader.Close();
fileStream.Close();
}
}
else
{
ScriptManager.RegisterStartupScript(
this, GetType(), "文件不存在", "alert('文件不存在!')", true);
}
return false;
}
复制代码

具体的代码我都已经注释过了,希望有用。

posted on   程序诗人  阅读(1208)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示