帮忙分析下这段下载代码

caibird1984 2008-07-10 06:59:14
有这么段下载文件的代码:

// 输出硬盘文件,提供下载
// 输入参数 _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","attachment;filename=" + 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 = 0; i < maxCount; i++)
{
if (_Response.IsClientConnected)
{
_Response.BinaryWrite(br.ReadBytes(pack));
System.Threading.Thread.Sleep(sleep);
}
else
{
i=maxCount;
}
}
}
catch
{
return false;
}
finally
{
br.Close();
myFile.Close();
}
}
catch(System.Exception e)
{
string s = e.ToString();
return false;
}
return true;
}


目前下载功能是能够实现,不过下载之后源文件就没有了。目前这个功能需要涉及到一部分直接保存在服务器硬盘上的文件,所以想请教各位怎么修改能够保留源文件?或者有什么不会删除源文件的下载方案可供参考的?小弟实在不想想把文件SaveAs到其他地方再下载,所以想问问各问。谢谢
...全文
111 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
caibird1984 2008-07-15
  • 打赏
  • 举报
回复
小弟自己建了个工程去试这段代码,也没有发现文件被删除的情况。应该是原来的程序在哪里有处理,小弟再找找吧。多谢各位。

另外致4楼MADfox1983,引用很简单,我也就不单独发邮件给你了。引用的方法这样就可以:

ResponseFile(Page.Request, Page.Resonse, "我的文件.avi", Server.MapPath("../File/abc.avi"), 1024000)


其中_fileName参数是输出时的文件名称(包括后缀),_fullPath参数是文件保存的绝对路径
yutian130 2008-07-11
  • 打赏
  • 举报
回复
if (_Response.IsClientConnected)
{
_Response.BinaryWrite(br.ReadBytes(pack));
System.Threading.Thread.Sleep(sleep);
}

这只是用文件流输出文件而已,没有涉及文件的下载和删除操作
liuxi2020121 2008-07-11
  • 打赏
  • 举报
回复
剛測了下,源文件沒被刪掉啊, 是不是你路徑重復了,覆蓋掉了?
MADfox1983 2008-07-11
  • 打赏
  • 举报
回复
该如何使用啊``````..........
xxoo2007 2008-07-11
  • 打赏
  • 举报
回复
经过验证,这段代码不会导致源文件的删除,应该是其他的代码有问题. 重新找过吧
MADfox1983 2008-07-11
  • 打赏
  • 举报
回复
mark
能否发一份完整的让小弟学习一下啊
gxscj-007@163.com
caibird1984 2008-07-11
  • 打赏
  • 举报
回复
致1楼&2楼,源文件在下载完成之后确实是没了,这才是我莫名其妙的地方。不知道这种输出会不会是把源文件转成文件流之后“移动”出去了?

因为下载可能会涉及到几百M的东西,所以原则上我不想先Copy到其他地方,那样会让别人觉得响应太慢
seesea125 2008-07-10
  • 打赏
  • 举报
回复
好像没看见哪里删除了。。。
sheng9hhd 2008-07-10
  • 打赏
  • 举报
回复
应该这里没有删除源文件

62,168

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧