首页 新闻 赞助 找找看

asp.net如何控制文件下载的权限?

0
悬赏园豆:50 [已关闭问题]

我找到三种方法,但都无法实现断点续传。我需要控制下载的文件大小是300M左右。
需要使用迅雷等下载工具,但这三种方法都无法实现,请教高手。谢谢。


前两种方法都有这样的毛病,不能用迅雷等下载工具下载,不能支持断点续传。
点一下下载链接,弹出迅雷对话框,然后点取消,甚至需要这样操作两次,才弹出windows默认的下载对话框。不知何故。

方法一(参考DownRar.aspx页面):

     如果你想使下载的文件对终端的用户是私有的,需要他们通过验证用户名和密码验证访问。那么所有人都会建议你不要把文件放在web服务器的根目录下,然后建议你使用Response.TransmitFile。但是,如果你没有服务器的访问权限,对你来说实现这样的功能将会非常困难。

    你不能访问服务器,你就只能就文件上传到web服务器的根目录下,这里有几个简单的步骤,能实现通过用户名和密码验证限制文件的访问。

    假如说, myfile.zip 是需要通过用户名和密码验证访问的文件。

    1、将myfile.zip 命名为myfile.config

    2、创建一个输入用户名和密码的页面。

    3、如果用户名和密码是正确的,使用下面代码输出文件。

         if (isValidUser)     
          {            
              Response.Clear();            
              Response.ContentType
= @"application/setup";            
              Response.AppendHeader(
@"Content-Disposition", ("attachment; filename=myfile.zip"));            
              Response.TransmitFile(
@"myfile.config");            
              Response.End();        
          }        
         
else       
          {            
// prompt the web user with some message of access privileges        
          }

如果你不能访问服务器,需要使用这个诀窍。在这里唯一的解决方法是,在asp.net中不允许访问扩展名为config的文件。

方法二(参考GetFile.aspx页面):

笔者做一个报表展示的网站,报表使用excel形式存放在服务器,希望登录的人或者有权限的人才能下载excel报表。但是文件下载的路径无法隐藏,所以页面控制根本没用。近日在研究iis的时候,突然就豁然开朗了。

   

首先编辑或者修改网站的web.config,加入或者修改红色区域

  <!--  身份验证

          此节设置应用程序的身份验证策略。可能的模式是 "Windows"

          "Forms" "Passport" "None"

   

          "None" 不执行身份验证。

          "Windows" IIS 根据应用程序的设置执行身份验证

            (基本、简要或集成 Windows)。在 IIS 中必须禁用匿名访问。

          "Forms" 您为用户提供一个输入凭据的自定义窗体(Web ),然后

           在您的应用程序中验证他们的身份。用户凭据标记存储在 Cookie 中。

          "Passport" 身份验证是通过 Microsoft 的集中身份验证服务执行的,

           它为成员站点提供单独登录和核心配置文件服务。

    -->

        <authentication mode="Forms">

    <forms name=".ASPXUSERDEMO" loginUrl="login.aspx" protection="All" timeout="60" path="/"><credentials passwordFormat="SHA1" /></forms>

    </authentication>

   

   

       <!--  授权

           此节设置应用程序的授权策略。可以允许或拒绝不同的用户或角色访问

          应用程序资源。通配符: "*" 表示任何人,"?" 表示匿名

          (未经身份验证的)用户。

    -->

   

    <authorization>

        <deny users="?"/>

            <!--  <allow     users="[逗号分隔的用户列表]"

                             roles="[逗号分隔的角色列表]"/>

                  <deny      users="[逗号分隔的用户列表]"

                             roles="[逗号分隔的角色列表]"/>

            -->

</authorization>

   

接着编写login.aspx

对于登录成功者加入

FormsAuthentication.SetAuthCookie(uid,false);

     FormsAuthentication.RedirectFromLoginPage(uid,false);

   

打开iis,找到你的网站,点右键,选属性,-》主目录-》配置

然后在“映射”中选添加,

 

方法是:添加.rar这个扩展名,要选择的可执行文件与.aspx那个选择一样即可。

好了,大功告成,现在再访问主站下的一个xls文档http://localhost/sms/1.xls,看到什么?

 

呵呵,没错,需要您登录了。当你输入登录信息并且登录了您才能下载这个文件!

 

   

对,就这么简单,如果加上role,可以进行更复杂的控制。

 

方法三(参考DownFile.aspx页面):

用个按钮,能避免出现弹出迅雷,但下载不了的情况。

代码
protected void btnDown_Click(object sender, EventArgs e)
{
   
string fileName = "111.rar";//客户端保存的文件名
    string filePath = Server.MapPath("Files/111.config");//路径

    System.IO.FileInfo fileInfo
= new System.IO.FileInfo(filePath);

   
if (fileInfo.Exists == true)
    {
       
const long ChunkSize = 102400;//100K 每次读取文件,只读取100K,这样可以缓解服务器的压力
        byte[] buffer = new byte[ChunkSize];

        Response.Clear();
        System.IO.FileStream iStream
= System.IO.File.OpenRead(filePath);
       
long dataLengthToRead = iStream.Length;//获取下载的文件总大小
        Response.ContentType = "application/octet-stream";
        Response.AddHeader(
"Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(fileName));
       
while (dataLengthToRead > 0 && Response.IsClientConnected)
        {
           
int lengthRead = iStream.Read(buffer, 0, Convert.ToInt32(ChunkSize));//读取的大小
            Response.OutputStream.Write(buffer, 0, lengthRead);
            Response.Flush();
            dataLengthToRead
= dataLengthToRead - lengthRead;
        }
        Response.Close();
    }
}

问题补充: 据说还有更改文件名字的方法,哪位高手知道,请不吝赐教。
大气象的主页 大气象 | 初学一级 | 园豆:79
提问于:2010-03-24 17:02
< >
分享
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册