我们在编写一些文档管理的项目时一定会有这样的问题。想控制客户下载的文件和下载次数,以及下载的时段。
比较好的方法是:使用ActiveX 控件就象 http://www.gotdotnet.com 中的代码共享。
通常我们不会选择怎么复杂的方案。
我的解决方案是:
在系统的 非Web 目录中存放文件,文件名已经经过了编码(主要是安全的考虑),当然我们也可以对文件内容进行加密。把真实的文件名放在数据库中(这样比把文件放在数据库上,如果客户有一个1G的文件,那你只有哭了 )。
用户下载的链接如下:
http://www.test.org/filedownload.aspx?e6feeccd90a9463d93b9dc231115bbb9 (是不是很象MS 的下载中心)
代码:
private void Page_Load(object sender, System.EventArgs e)
{
//读取文件
if (null!=Page.Request.Url.Query )
// 请求字符串为
FileGuid = Page.Request.Url.Query.Substring (1); // fileGuid= e6feeccd90a9463d93b9dc231115bbb9
// Globals.fileLibDir 就是那个我们存放文件的目录
if (!File.Exists(Globals.fileLibDir + FileGuid))
{
// 文件没有找到
Page.Response.Redirect ("error.aspx?msg=文件不存在",true );
return;
}
// 真实的文件名
string fileName = getFileNameByStorageName(FileGuid);
if (fileName == string.Empty )
{
//文件没有找到
Page.Response.Redirect ("error.aspx?msg=链接错误,请与管理员联系!",true );
return;
}
Page.Response.ContentType="APPLICATION/OCTET-STREAM";
// 注意下面的Encode 编码,不然无法处理中文文件名
Page.Response.AddHeader("Content-Disposition","attachment; filename=" + HttpUtility.UrlEncode(fileName,Encoding.UTF8 ) );
Page.Response.WriteFile ( Globals.fileLibDir + FileGuid);
}
打印 | 张贴于 2004-03-22 10:52:00 | Tag:ASP.Net C#
留言反馈
大家看看MSDN吧,上面有关于大文件的下载方法,不错。
但这个补丁目前还没公开,估计在1.2的FRAMEWORK中可能会出现
如果有兴趣的话,可以去MS动力营去翻一下,那里说的很详细