点缀's Blog

用.NET点缀我们的生活
随笔 - 44, 评论 - 378, 引用 - 84

导航

工具

关于

脊柱是我们这种生命的重要特征,在此基础上我们才有了光芒的智慧和丰富的情感。上帝赋予我们自由的意志,同时也赋予我们选择的重担。

标签

每月存档

广告



访客

 

我们在编写一些文档管理的项目时一定会有这样的问题。想控制客户下载的文件和下载次数,以及下载的时段。

比较好的方法是:使用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#

留言反馈

re:File Download 问题解决! 编辑
File Download 问题解决!ooeess
2005-06-14 16:51:00 | [匿名用户:测汞]
re:File Download 问题解决! 编辑
File Download 问题解决!ooeess
2005-06-14 04:23:00 | [匿名用户:气味检测仪]
re:File Download 问题解决! 编辑
^_~,pretty good!csharpsseeoo
2005-05-16 23:11:00 | [匿名用户:防静电液、防静电测试]
re:File Download 问题解决! 编辑
^_^,Pretty Good!
2005-04-16 02:17:00 | [匿名用户:智能后备操作器]
re:File Download 问题解决! 编辑
^_^,Pretty Good!
2005-04-10 19:59:00 | [匿名用户:温湿度控制器]
re: File Download 问题解决! 编辑
WriteFile只能用在小文件上,如果文件达到1M以上就要考虑使用Response的输出流了,Web程序是服务器程序,要考虑性能,如果有1000个用户要下载1M的文件,通过WriteFile方式服务器就要付出1G的内存来下载,那不是很惨,
大家看看MSDN吧,上面有关于大文件的下载方法,不错。
2004-10-20 12:35:00 | [匿名用户:CB]
re: File Download 问题解决! 编辑
动力营在哪?
2004-08-21 18:40:00 | [匿名用户:yy]
关于大文件下载的问题MS有一个内部补丁的 编辑
下载方式也改了

但这个补丁目前还没公开,估计在1.2的FRAMEWORK中可能会出现

如果有兴趣的话,可以去MS动力营去翻一下,那里说的很详细
2004-03-24 13:04:00 | [匿名用户:东方蜘蛛]
回复: File Download 问题解决! 编辑
我觉得挂掉应该与Ihttphanlder无关才是吧?而是用WriteFile造成的吧?Ihttphanlder无非是处理请求,关挂不挂什么事?WriteFile之前估计得把文件先读入asp.net的进程空间再写出?那挂掉就是正常的事了?如果不用先读入再输出的话,那么直接下载文件也该受不了的?
2004-03-22 20:00:00 | [匿名用户:cnlamar]
回复: File Download 问题解决! 编辑
还有机器是不会怪的 因为你可以控制每秒输出的流 大小 但是县城就是开不到 41个 ....一起倒!
2004-03-22 16:23:00 | [匿名用户:聪明的猫猫]
回复: File Download 问题解决! 编辑
连这个 blog 也是的 他的Ihttphanlder也是撑不过 40个同时县城的 可能是因为处理的流比较小 所以没问题 相同的代码 换输出 大文件(600M最好) 我试了县城开不到 41个
2004-03-22 16:20:00 | [匿名用户:聪明的猫猫]
回复: File Download 问题解决! 编辑
To 猫猫:那点缀的这种方式其实也一样的呀。
2004-03-22 16:04:00 | [匿名用户:开心就好]
回复: File Download 问题解决! 编辑
To:猫猫 的确这样是对系统的一种攻击,但也可以从另一个层面禁止多线程下载。双要提到gotdotnet.com 里,里面的下载也很有讲究。
2004-03-22 15:04:00 | [匿名用户:点缀]
回复: File Download 问题解决! 编辑
IHttpHandle 你下 300M大小的文件 用 FlashGet开 41个县城看看你机器挂了没
2004-03-22 14:22:00 | [匿名用户:聪明的猫猫]
回复: File Download 问题解决! 编辑
没看出来。。。
2004-03-22 13:31:00 | [匿名用户:聪明猫猫]
回复: File Download 问题解决! 编辑
如果中文文件名很长(大概超过11个汉字吧)就下载不了了,不知道有什么解决办法没有?
2004-03-22 13:27:00 | [匿名用户:fengzhimei]
博客主人设置本博客不允许匿名用户发表言论,请登录后再试

Powered by: Joycode MVC Blogger System