我找到三种方法,但都无法实现断点续传。我需要控制下载的文件大小是300M左右。
需要使用迅雷等下载工具,但这三种方法都无法实现,请教高手。谢谢。
前两种方法都有这样的毛病,不能用迅雷等下载工具下载,不能支持断点续传。
点一下下载链接,弹出迅雷对话框,然后点取消,甚至需要这样操作两次,才弹出windows默认的下载对话框。不知何故。
方法一(参考DownRar.aspx页面):
如果你想使下载的文件对终端的用户是私有的,需要他们通过验证用户名和密码验证访问。那么所有人都会建议你不要把文件放在web服务器的根目录下,然后建议你使用Response.TransmitFile。但是,如果你没有服务器的访问权限,对你来说实现这样的功能将会非常困难。
你不能访问服务器,你就只能就文件上传到web服务器的根目录下,这里有几个简单的步骤,能实现通过用户名和密码验证限制文件的访问。
假如说, myfile.zip 是需要通过用户名和密码验证访问的文件。
1、将myfile.zip 命名为myfile.config。
2、创建一个输入用户名和密码的页面。
3、如果用户名和密码是正确的,使用下面代码输出文件。
如果你不能访问服务器,需要使用这个诀窍。在这里唯一的解决方法是,在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页面):
用个按钮,能避免出现弹出迅雷,但下载不了的情况。
{
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();
}
}