为了防止非法用户直接输入文件地址下载,我把文件先读出来到输出流:
namespace FWeb.FWareHouse
{
public partial class BackupDbDown : FPage//FPage从Page继承,包含身份验证
{
protected override void OnLoad(EventArgs e)
{
String fileName = Request.QueryString("FN").ToString();
fileName = Server.MapPath(fileName);
FileStream f = new FileStream(fileName, FileMode.Open, FileAccess.Read);
Response.ClearHeaders();
Response.ContentType = "application/x-msdownload";
Response.AddHeader("Content-Disposition", "attachment;filename= " + System.IO.Path.GetFileName(fileName));
byte[] buffer = new byte[4096]; //担心一次读入大文件占内存,所以一块一块的读入。
while (true)
{
int b = f.Read(buffer, 0, buffer.Length);
if (b == 0) break;
Response.BinaryWrite(buffer);
}
f.Close();
Response.Flush();
Response.Close();
}
}
}下面有以下问题:
1.在点击链接打开下载对话框以后,IE提示文件大小为未知,怎么样才能让IE显示文件大小?是不是要在标头里设置什么?
2.用网际快车下载时,下载了一个登录页面,我汗,没通过验证。右击另存或直接点击下载却可以。怎么办?
3.像这样的流输出下载,如果下载很大的文件,会不会产生脚本超时错误?
namespace FWeb.FWareHouse
{
public partial class BackupDbDown : FPage//FPage从Page继承,包含身份验证
{
protected override void OnLoad(EventArgs e)
{
String fileName = Request.QueryString("FN").ToString();
fileName = Server.MapPath(fileName);
FileStream f = new FileStream(fileName, FileMode.Open, FileAccess.Read);
Response.ClearHeaders();
Response.ContentType = "application/x-msdownload";
Response.AddHeader("Content-Disposition", "attachment;filename= " + System.IO.Path.GetFileName(fileName));
byte[] buffer = new byte[4096]; //担心一次读入大文件占内存,所以一块一块的读入。
while (true)
{
int b = f.Read(buffer, 0, buffer.Length);
if (b == 0) break;
Response.BinaryWrite(buffer);
}
f.Close();
Response.Flush();
Response.Close();
}
}
}下面有以下问题:
1.在点击链接打开下载对话框以后,IE提示文件大小为未知,怎么样才能让IE显示文件大小?是不是要在标头里设置什么?
2.用网际快车下载时,下载了一个登录页面,我汗,没通过验证。右击另存或直接点击下载却可以。怎么办?
3.像这样的流输出下载,如果下载很大的文件,会不会产生脚本超时错误?
问题2: 页面不要用session或cookie而是用URL的参数验证权限,例如对 “某个内容”+“时间等”进行MD5作为验证
问题3: 不会超时,但你需要在文件流的中间多次Response.Flush(),而不是只在最后做一次。
protected override void OnLoad(EventArgs e)
{
string fileName= Request.QueryString("FN").ToString();
fileName = Server.MapPath(fileName);
FileStream f = new FileStream(fileName, FileMode.Open, FileAccess.Read);
Response.ClearHeaders();
Response.ContentType = "application/x-msdownload";
Response.AddHeader("Content-Disposition", "attachment;filename= " + System.IO.Path.GetFileName(fileName));
byte[] buffer = new byte[4096];
long len=0;
int b = f.Read(buffer, 0, buffer.Length);
while (b>0)
{
Response.BinaryWrite(buffer);
len+=b;
b = f.Read(buffer, 0, buffer.Length);
}
f.Close();
Response.AddHeader("Content-Length",len.ToString());
Response.Flush();
Response.Close();
}