有这么段下载文件的代码:// 输出硬盘文件,提供下载
// 输入参数 _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到其他地方再下载,所以想问问各问。谢谢
// 输入参数 _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到其他地方再下载,所以想问问各问。谢谢
解决方案 »
- 弹出DIV在按钮触发后不关闭
- wuyq11 静态网页的本质是不是 通过模板和根据url生成 以及下面的两个函数
- 一个.net的问题,不明很久.关于.net跨平台
- 求一段JS,关于图片不可用!
- ========急急急。。。这个问题差点要了我的小命,高人来啊,只有10分了。。还是希望高手可以过来帮忙,过来顶===========
- 大家好,我有个问题要请教,dreamweaver连接access数据库脚本代码生成却看不到表 (表已建好) 是怎么一会事?有高手请指教,急用!!!
- 分页的DATAGRID怎样导出到EXCEL,且有网格线和可加表头???
- 为什么多出来了“>”'>'符号
- 『请关注』问一个与SQL相关的问题。
- 请问在asp.net中如何实现登录是的身份验证?
- 如何实现数据库的增量添加
- treeview textbox button
能否发一份完整的让小弟学习一下啊
[email protected]
{
_Response.BinaryWrite(br.ReadBytes(pack));
System.Threading.Thread.Sleep(sleep);
} 这只是用文件流输出文件而已,没有涉及文件的下载和删除操作
其中_fileName参数是输出时的文件名称(包括后缀),_fullPath参数是文件保存的绝对路径