注册 登录
编程论坛 ASP技术论坛

用ASP实现文件下载

阳光白雪 发布于 2005-11-22 09:40, 4185 次点击
<%
'**************************************************************
'**使用方法: **
'**在点击下载处加连接<a href="load.asp?filename=文件名"></a> **
'**阳光白雪——2005年11月21日 **
'**E-mail:chenmanyi0818@126.com **
'**HomePage:http://www.toumh.com **
'**************************************************************
'**************************************************
'** 实现文件下载函数 **
'**************************************************
Function Filedownload(filename)
Dim strchar,fliesend,objectFile,objfile,objStream,path,pathtype
pathtype = "application/x-msdownload"
path = server.MapPath(filename)
Const loadfilesize=32768 '32KB,也可取其它值,单位:字节
'在给path赋值后,其最终值必定是该图片在服务器端存储器上的绝对路径,如 C:\Inetpub\wwwroot\pic\help.gif
'因为 server.MapPath 取得的只是站点根目录的路径,所以在后面还应加上文件所在的文件夹再加文件名
'例如:要下载的文件 setup.exe 在根目录的 download 文件夹下,则 path = server.MapPath("download/"&filename)
'***********************************
'测试用
'response.Write(path)
'response.Write(filename)
'response.End()
'***********************************
fliesend=0
TransferFile = True
Set objectFile = Server.CreateObject("Scripting.FileSystemObject")
Set objfile = objectFile.GetFile(Path)
Set objStream = objfile.OpenAsTextStream(1,-1)
Response.AddHeader "content-type", pathtype
response.AddHeader "Content-Disposition","attachment;filename="&filename
Response.AddHeader "content-length", objfile.Size
Do While Not objStream.AtEndOfStream
strchar = objStream.Read(1)
Response.BinaryWrite(strchar)
fliesend = fliesend + 1
If (fliesend MOD loadfilesize) = 0 Then
Response.Flush
If Not Response.IsClientConnected Then
TransferFile = False
Exit Do
End If
End If
Loop
Response.Flush
If Not Response.IsClientConnected Then
TransferFile = False
end if
objStream.Close
Set objStream = Nothing
Set objectFile = Nothing
End Function
'****************************************************
'** 文件下载函数结束 **
'****************************************************
Dim fileneme,downloadfile
filename = request("filename") '此处的 filename 仅为下载文件的名称(包括扩展名)
downloadfile = Filedownload(filename) '调用文件下载函数
Response.End
%>

[此贴子已经被作者于2007-3-21 15:15:47编辑过]

19 回复
#2
wxhwxh2005-11-22 09:47
太好了,厉害!我试试看。
#3
hxfly2005-11-22 09:47
楼主,刚才的东西哪里去了?
帖出来
#4
阳光白雪2005-11-22 13:01

你在下载图片,word文档这些浏览器能直接打开的文件就不能用你说的那种方法了,虽然可以通过右键另存为,可是我很懒,嫌麻烦~~~~~~~~~~~~,就弄了这个我觉得简单点的方法~~~~~~~~~~

#5
szeee2006-04-21 00:53

Do While Not objStream.AtEndOfStream
strchar = objStream.Read(1)
Response.BinaryWrite(strchar)
fliesend = fliesend + 1
If (fliesend MOD loadfilesize) = 0 Then
Response.Flush
If Not Response.IsClientConnected Then
TransferFile = False
Exit Do
End If
End If
Loop

版主,你这程序岂不是很耗资源图片小文件还可以,但是大的影音文件下载就增加系统负担了。

#6
阳光白雪2006-04-21 08:11

有道理,不过就是不知道该如何修改,楼上有什么好的方法还请指点!

#7
szeee2006-04-22 13:28
这个问题我思考了三天了,得出下面的结论。我的目的就是隐藏真实的下载地址,我也曾试着用Server.Transfer 替代Response.Redirect 再结合Response.AddHeader属性,也就是在服务端读人url,给客户段作出下载命令。但这种方式客户端没响应。据此判断客户端保存文件只有两种方式:
一,只能是自己读入url,然后自己再作下载判断;二,是被动接受服务端传来的数据流,来保存文件。
前者客户端自己已经读取了url,肯定暴露了真实的地址;后者就是你上面用的类似功能会耗服务器资源的。我也查看了许多下载网站,他们大都是采用前者,然后再结合服务器的防盗链技术来实行的。因此我觉得下面的重点就是研究和学习服务器的防盗链技术了。
各位网友有不共观点请明示,谢谢!
#8
szeee2006-04-23 22:38
不知道静夜思这个下载怎么做的?https://www.bc-cn.net/bbs/dispbbs.asp?boardID=10&ID=15440&page=1
#9
icecool2006-04-24 13:01

呵呵,ASP木马就是这些做出来的!

#10
icecool2006-04-24 13:02
  看完楼主的帖子,我的心情竟是久久不能平复,正如老子所云:大音希声,大象希形。我现在终于明白我缺乏的是什么了,正是楼主那种对真理的执着追求和楼主那种对理想的艰苦实践所产生的厚重感。面对楼主的帖子,我震惊得几乎不能动弹了,楼主那种裂纸欲出的大手笔,竟使我忍不住一次次的翻开楼主的帖子,每看一次,赞赏之情就激长数分,我总在想,是否有神灵活在它灵秀的外表下,以至能使人三月不知肉味,使人有余音穿梁,三日不绝的感受。楼主,你写得实在是太好了。我唯一能做的,就只有把这个帖子顶上去这件事了
#11
small20062006-10-01 15:17
我是ASP新手,在做文件下载功能的时候遇到点问题,各位大侠帮帮我.
我用ASP,IIS,VBScript做了个校园网,在做下载功能的时候,要下载的资料在本地可以下载,可是传到服务器上就出现"文件格式不正确的"错误提示,文件的地址是正确的,
我把要下载的文件放在了download文件夹里,网站的文件地址是http://www.shool.edu.cn/download/2006324650.rar.
一定要用函数实现吗,能用VBScript实现吗?能写段详细代码给我吗
#12
雷雷2006-10-04 15:24
以下是引用icecool在2006-4-24 13:02:00的发言:
  看完楼主的帖子,我的心情竟是久久不能平复,正如老子所云:大音希声,大象希形。我现在终于明白我缺乏的是什么了,正是楼主那种对真理的执着追求和楼主那种对理想的艰苦实践所产生的厚重感。面对楼主的帖子,我震惊得几乎不能动弹了,楼主那种裂纸欲出的大手笔,竟使我忍不住一次次的翻开楼主的帖子,每看一次,赞赏之情就激长数分,我总在想,是否有神灵活在它灵秀的外表下,以至能使人三月不知肉味,使人有余音穿梁,三日不绝的感受。楼主,你写得实在是太好了。我唯一能做的,就只有把这个帖子顶上去这件事了

看完你写的文字,满身的鸡皮疙瘩……

#13
土豆ai冬瓜2007-02-03 16:20
loading..我看你适合 搞文学
#14
hangxj2007-02-03 17:59
学习一下
#15
hangxj2007-02-07 17:02
今天超无聊,把阳光白雪的函数做了小小的改进,
其实那个路径问题,在写文件名的时候直接写上去也可以,
但是文件下载的时候就会有点小问题
具体的就是:文件名:load 文件类型:未知;
加上一个filepath就可以解决.


<%
'**************************************************************
'**使用方法: **
'**在点击下载处加连接<a href="load.asp?filepath=文件路径&filename=文件名"></a> **
'**阳光白雪——2005年11月21日 **
'**E-mail:chenmanyi0818@126.com **
'**HomePage:http://www.ec2002.com ; **
'**************************************************************
'**修改:hangxj——2007年02月07日 **
'**E-mail:121sun@163.com **
'**HomePage:http://www.hangxj.com ; **
'**************************************************
'** 实现文件下载函数 **
'**************************************************
Function Filedownload(filepath,filename)
Dim strchar,fliesend,objectFile,objfile,objStream,path,pathtype
pathtype = "application/x-msdownload"
path = server.MapPath(filepath&filename)
Const loadfilesize=32768 '32KB,也可取其它值,单位:字节

'***********************************
'测试用
'response.Write(path)
'response.Write(filename)
'response.End()
'***********************************
fliesend=0
TransferFile = True
Set objectFile = Server.CreateObject("Scripting.FileSystemObject")
Set objfile = objectFile.GetFile(Path)
Set objStream = objfile.OpenAsTextStream(1,-1)
Response.AddHeader "content-type", pathtype
response.AddHeader "Content-Disposition","attachment;filename="&filename
Response.AddHeader "content-length", objfile.Size
Do While Not objStream.AtEndOfStream
strchar = objStream.Read(1)
Response.BinaryWrite(strchar)
fliesend = fliesend + 1
If (fliesend MOD loadfilesize) = 0 Then
Response.Flush
If Not Response.IsClientConnected Then
TransferFile = False
Exit Do
End If
End If
Loop
Response.Flush
If Not Response.IsClientConnected Then
TransferFile = False
end if
objStream.Close
Set objStream = Nothing
Set objectFile = Nothing
End Function
'****************************************************
'** 文件下载函数结束 **
'****************************************************
Dim filepath,fileneme,downloadfile
filepath = request("filepath") '下载文件的相对路径
filename = request("filename") '此处的 filename 仅为下载文件的名称(包括扩展名)
downloadfile = Filedownload(filepath,filename) '调用文件下载函数
Response.End
%>
#16
绿野微风2007-04-04 20:49
不明白,下载文件嘛,搞个链接指向这文件不就OK了?
#17
阳光白雪2007-04-05 08:13
以下是引用绿野微风在2007-4-4 20:49:00的发言:
不明白,下载文件嘛,搞个链接指向这文件不就OK了?

对于浏览器不支持的文件是可以,但是对于那些能直接通过浏览器打开的,像图片,FLASH动画等,这个就比较方便,不需要用右件“另存为”来保存了

#18
yunxiang20052007-04-05 20:46
up......
#19
kyle_mao2012-02-27 10:43
大一点的附件就不行,下载不了,为什么?
1