蓝森林首页 | 返回主页 | 本站地图 | 站内搜索 | 联系信箱 |
 您目前的位置:首页 > 自由软件 > 技术交流 > 应用编程


    

蓝森林 http://www.lslnet.com 2006年8月25日 8:28

[asp]给稻香老农的无组件上传加上漂亮真实的进度条

[b]1。基本原理[/b]
分块接收数据,把接收的数据和全部数据的大小写入xml文件,由客户端的进度条显示文件读取。
如果你还没有使用过这个东西,请到
http://www.5xsoft.com
下载相关代码学习,这里不进行基础解释。

[b]2。文件组成[/b]
[1]randomString.asp 随机字符串生成函数。
[2]fileUpProgress.asp 上传进度显示。
[3]fileUpProgressRead.asp 上传进度读取。
[4]wang_upload_5xsoft.inc 我稍稍修改的稻香老农的无组件上传类。
你可以把这四个文件放在include目录下,任何目录下的文件都可以调用。

[b]3。使用方法[/b]
假设你原来实现上传功能所用的两个文件是:upload.asp和uploadSave.asp。
上述四个文件放在include目录下。你可以改变路径,注意修改相关路径即可。

1.upload.asp中增加以下代码:
-------------------------------------------------------------
[color=blue]<!--#include file="include/randomString.asp" -->
<% ProgressID = gen_key(10) %>[/color]
....
<form action="test_uploadSave.asp" method="post" enctype="multipart/form-data" [color=blue]onSubmit="myOpen(this)"[/color]>
....
</form>
[color=blue]<script>
function myOpen(form){
        window.open("include/fileUpProgress.asp?progressID=<%=ProgressID%>","","width=500,height=200,scrollbars=no,toolbar=no,status=no,resizable=no,menubar=no,location=no");
        var url=form.action;
        if (url.indexOf("?",0)==-1) {
                form.action = url+"?progressID=<%=ProgressID%>";
        }else{       
                form.action = url+"&progressID=<%=ProgressID%>";
        }
}
</script>[/color]
-------------------------------------------------------------
2.在uploadSave.asp中include这个wang_upload_5xsoft.inc 文件。原来的upload_5xsoft.inc 不必使用。
[color=blue]<!--#include file="include/wang_upload_5xsoft.inc" -->[/color]
假设原来你用了
        set upload=new upload_5xsoft
这么一句,那么现在改成
        [color=blue]set upload=new upload_5xsoft
        upload.ProgressID=Request.QueryString("progressID") '一定是这行在先。
        upload.GetUpFile[/color]
这么三行即可。其他保持原来的写法即可。
----------------------------------------------------------
完毕。

[b]4。使用进度指示后的影响[/b]
对你原来的功能没有任何影响。它只是一个额外的进度显示,和数据处理部分毫不掺和。

[b]5。效果贴图[/b]
[img]http://www.mytju.com/upfile/20049917152298.gif[/img]
[b]6。示范代码下载[/b]
http://mytju.com/classCode/

欢迎大家试用并提出宝贵意见。多谢!

占坑~~收藏~~

我还以为我是沙发.被抢了.收藏之

我想问一下,这个进度条是根据上传数据的大小改变还是只是一个视觉效果(无实际意义的)?

还有你的"基本原理"写得不是很明了,能仔细说说么?

呵呵,这个当然是真实的了……尝试一下就知道了。

其实很简单,你下载代码看看就明白了。

其实有人说用application来保存进度,我没有尝试。
因为用session是不可以的,application我尝试了几把,也没成功(也可能我把机器折腾没有响应了)。

所以只有用文件来周转了。

厉害~

对客户端有什么要求吗?

对了,龟龟,我用了这个东西:Microsoft.XMLDOM
--------------------------
客户端要求什么呢?得是IE6吧?

刚才想问这个问题,原理是什么?讲得不是很清楚!
听说微软update的那个进度条还要下载客户端插件!
百分比是怎么实现的,是如何讲算上传的进度的?

我down下来了~!谢谢版主~!

有人用了没有,怎么样?有出错的情况没有?

结果总是这样:

文件上传进度指示条
状态:正在初始化....

已经上传:上传动作尚未启动或已经完成!
使用时间:1 秒  
平均速率:0 KB/秒  

//还有,我直接用化境的上传类子.
总是出现如下错误,在好多asp用到这个类的程序里也是如此,可是到虚机上有时也可以用了.还有这个最大可以上传多大文件呢??:
Server 对象 错误 'ASP 0177 : 800401f3'

Server.CreateObject 失败

/upclass/example/upload_5xsoft.inc,行 36

无效的类别字符串 化境HTTP上传程序 Version 2.0


请输入要上传至的目录!

set tStream = Server.CreateObject("adodb.stream")
不支持adodb.stream。

收藏先...

我是用ASPUPLOAD这个组件。找一个有注册码的用用吧。上面还有很多例子。上面的进度条很好。我把它改成了XMLDOM的。成功了。呵呵!!!!

文件小网络畅通的情况下,进度条根本就读不到100%!

这个没有办法,速度太快,进度文件创建后马上被清除了。

进度条显示文件就读不到进度了。

[没有开始上传]和[上传已经完成]都不属于[上传进度中],当然没有进度。

我已经提示:尚未启动,或已经上传完成。

厉害!而且我感觉上传速度也有质的飞跃,以前也用稻香老农的组件上传,大小超过1M就变得很慢,感觉像死机,现在居然几秒钟就搞定了,版主是不是把它优化啦!

上传大文件时,发现服务器内存占用不断上升,最后死机.如果多人上传文件(大数据)或上传多文件时,出现服务器内存溢出.

楼上的是无组件上传本身的问题了。我只是加个进度条而已。

喜欢收藏了!

感觉实用性不大,因为一般在线上传的也就是一些很小的图片,大的东西还是通国FTP上传,不过还是感谢楼主!!!

即使只能传小文件
还是一样很值得学习

我找了个上传的是这样的,怎么加上进度条?
<%
Server.ScriptTimeout=999
%>
<!--#include file="conn1.asp"-->
<!--#include file="UpLoadClass.asp"-->
<%
dim strFile1,lngSize1,strFile2,lngSize2,dblTime,dblSpeed,strIp,strUser,strMessage
dim time1,t,v
        time1=timer()
Set myrequest=new UpLoadClass
        myrequest.MaxSize  = 0
        myrequest.FileType = ""
        myrequest.Savepath = "UpLoadFile/"
        myrequest.open
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>上传信息确认</title>
<link href="../style/basic.css" rel="stylesheet" type="text/css">
</head>
<body>
<table width="760" border="0" align="center" cellpadding="5" cellspacing="0" bgcolor="#FFFFFF" style="border:1px solid #999999">
  <tr>
    <td>
        <blockquote>
        <%
        response.write "<br>"&myrequest.Version&"<br>"
       
        strFile1=myrequest.Form("Photo")
        intError=myrequest.Form("photo_Err")
        lngSize1=0
        if intError>=0 then
                response.write "<br>上传文件1名为:<a href='"&myrequest.Savepath&strFile1&"' target='_blank'>"&strFile1&"</a>"
                response.write "<br>上传文件1类型:"&myrequest.Form("Photo_Type")
                response.write "<br>上传文件1原名:"&myrequest.Form("Photo_Name")
                response.write "<br>上传文件1宽度:"&myrequest.Form("photo_Width")
                response.write "<br>上传文件1高度:"&myrequest.Form("photo_Height")
                lngSize1=myrequest.Form("photo_Size")
                if intError>0 then strFile1="Err:"&intError&"/"&myrequest.Form("photo_Name")
                response.write "<br>上传文件1大小:"&lngSize1&" Byte"
                response.write "<br>文件1上传路径:"&myrequest.Form("photo_Path")
                response.write "<br>文件 1 扩展名:"&myrequest.Form("photo_Ext")
        else
…………………………

需要修改uploadClass.asp。
其他差不多。

如果要上传两个文件怎么办?

哇,牛呀,我早就觉得 老农 的上传没进度条很不爽.

对我来说还是怎么用比较重要.hehe

但是我时常做的都是多文件上传,能都显示进度条吗? 啊 ...

这是整体上传的进度,和几个文件没有关系的。

只要是上传就有进度的。

en,好象真的不错.

不过我提个建议:
"尚未启动,或已经上传完成。"
这样的提示真不好,让用户去猜吗?

能不能改进成检测一下被上传的文件是不是已经存在:
set CheckFile=server.createobject("scripting.filesystemobject")
if CheckFile.fileExists(Server.mappath(".....") then
报告"已经上传完成
else
报告"未启动上传"
end if

行不行得通?


因为这个进度条是任何一个上传页面都可以用的,是通用的,
所以无法知道人家上传的文件名是什么,而且人家可以改名保存的。
所以这个方法行不通了。

1。文件较大的时候,这个就应该表示还没有启动,服务端的进度文件还没有生成,等一会进度条就会走了。
2。文件较小的时候,几乎就瞬间完成了,进度条刚显示上传动作已经完成了。服务端的进度文件生成后已经被删除了。进度文件还是不存在。

两种情况是无法区分的。所以我提示:尚未启动或已经完成。

很好猜得,完成了的话,上传页就已经有结果了啊。没启动的话,一会就会走了。

一孤行在上个帖子中说

是怎么回事啊??发现没有文件被上传

萧萧小雨,请问怎么样来限制上传格式~!?我加了
if right(filename,3)="mid" or right(filename,3)="mp3" or right(filename,3)="wma" 就执行上传动作~!但却总是不行~!

你是想客户端拦截吧?
下面是检测图片的,改改就成。参数是文件框的value。
========================
function isPic(filePath){
        var temp;
        var ExtList = ".jpg.gif.bmp.png.swf";
        var the_ext = filePath.substr(filePath.lastIndexOf(".")+1).toLowerCase();
        if (ExtList.indexOf(the_ext)==-1){
                alert("不是图片,请选择图片文件!");
                return false;
        }
        return true;
}
=======================

OK~!谢谢~!最近用了这个改进的组件~!当上传文件比较大时~!效果非常不错~!但当文件很小时~!那就不行了~!因为程序根本没来得急检测出上传文件的属性,文件就已经上传了~!这样导致那个进度条一直处于"正在初始化...."的状态,并且进度条弹出框要手工关掉~!我想各位使用者应该也发生了这种情况吧~!?

萧萧小雨~!你上面的JS我觉得在我这种情况不好改呀~!我把我的代码贴上来~!帮我看看~!TKS~!我只允许它上传mp3,mid,wma三种文件格式.!

if trim(F_File)<>"" and (right(trim(F_File),3)="mid" or right(trim(F_File),3)="mp3" or right(trim(F_File),3)="wma") then

上面的F_File为上传的文件名~!上面的语句只能让后缀为mp3,mid,wma的文件上传,但当把后缀为MP3,MID,WMA或为Mp3,Mid,Wma时都上传不了~!请问哪位有什么办法解决~!? :confused: :mad:

LCase((right(trim(F_File),3))=...

有问题:
1.fileUpProgress.asp必须和上传的ASP文件页面在同一个文件夹才行?
因为我几个文件夹里都有文件有上传功能的,如果是这样,就得每个文件夹都COPY一个fileUpProgress.asp
如果不是就用不了,出现上传动作尚未启动或已经完成!而且窗口一直不会关闭。

2.当上传的文件大于20M时,进度条已显示100%并关闭了,但是文件还要等一阵才上传完。我是在本地电脑测试的,网速很快了,不知上传到网络会怎样?

1.恩,是个问题。
因为进度文件是uploadSave的文件生成的,是和他一个目录的,fileUpProgress.asp也是从这个目录取得,所以........
恩,我得改下。

2。到了网络应该没有这个问题。


好东西,虽然看到的晚点,收之

楼主好厉害啊!

现在我想用这个类同时上传两个文件应该怎么改呢

收藏!!!!!!!!!111

fxlijun在上个帖子中说

这个没什么难的吧,看看说明文档。
http://www.5xsoft.com
自己down一个,看说明吧。

谢谢楼主了!

虽然一直用ASPCNUP,但还是收藏了!什么时候也给ASPCNUP加个进度条,那俺也爽爽!

啦啦啦,我改好了。现在可以在任意目录下文件中进行调用了。
而且“"尚未启动,或已经上传完成。"这个提示也不会有了。
只会提示”尚未启动“了。
进度条一定会到100%的,除非你的主程序出错了。

怎么获取上传文件的路径保存到数据库,像给稻香老农的无组件上传第一版可以获得上传文件路径?

http://www.5xsoft.com 这个网站根本就没链接点啊...

他的网站好像要改版,可是好久没有动静了,估计忙别的去了。
点这个下载吧:
http://www.mytju.com/classCode/class_downCode.asp?ID=7




Copyright © 1999-2000 LSLNET.COM. All rights reserved. 蓝森林网站 版权所有。 E-mail : webmaster@lslnet.com