天天看点

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

  我找到三种方法,但都无法实现断点续传。我需要控制下载的文件大小是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页面):

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

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

代码 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();

    }

}

继续阅读