PHP:显示文件上传进度及上传任意大小的文件
update: UGiA PHP UPLOADER V0.2已发布:http://www.ugia.cn/?p=70
利用php上传比较大的文件时,往往需要很长的等待时间,而且受网络和软件等的影响,经常会出现超时及上传失败的现象。如何在上传文件时实时的得到文件上传进度,以及如何避开php和其他因素的限制上传任意大小的文件呢?
php同asp等其他语言对上传文件的处理方式不同,asp中可以用Request.BinaryRead流式的读取客户端提交的数据。php是把文件存放在临时文件夹中,在文件上传完成后才能够获取其信息以及对其进行操作。如果在上传过程中我们能够得到其临时文件的文件名,我们就可以通过判断临时文件的大小来来得到上传进度,不过好像没有办法得到。所以我们只能通过其他方式,就是利用php的socket扩展建立一个简单的服务器,把数据post到这个服务器上,然后再用我们自己的机制来处理。
先说说流程,首先用php的socket函数库建立一个临时的http服务器,在某一端口监听,然后把ip地址和端口号通知客户端,客户端把上传表单提交到http://srvIpAddress:port(临时服务器), 临时服务器接受客户端请求,并读取post数据,分析并获取客户端上传的文件信息,把文件保存在服务器上,然后关闭临时服务器,释放资源,上传完成。 有点绕,不过思路还是简单的。
稍后我会发布一个类库,暂定名为:UGiA Visual PHP Uploader, 这样大家就可以在程序中很方便的调用了。效果如下:


email & msn:
shishirui said,
May 2, 2005 @ 12:29 pm
非常期待!!!
safer said,
May 3, 2005 @ 12:55 am
希望发布得时候,可以 gmail 发份给我。谢谢
Jimmy said,
May 3, 2005 @ 1:18 pm
期待啊~~~
andot said,
May 5, 2005 @ 2:35 pm
太棒了。跟bindows整合到一块就更好了。bindows正好没有文件上传组件呢。不过用对话框不太好。只能用在IE上。
tsing said,
May 6, 2005 @ 3:01 pm
sf上有一个类似的:Mega Upload Progress Bar
http://sourceforge.net/projects/megaupload/
legend said,
May 6, 2005 @ 3:56 pm
Mega Upload需要perl
现在有几个问题需要解决
一个是上传时,用xmlhttp或者替换script src的方式获取进度,在开始向临时服务器post数据时,会打不开页面,难道会是“阻塞”?但是通过代理服务器就可以 !-_-, 所以可能需要用其他方式来获取进度信息,初步考虑用flash
第二个是由于http协议的不可靠,上传会中断…
第三个是上传中途用户取消或者其他原因,留下好多垃圾,还得写垃圾回收
Dennis said,
May 10, 2005 @ 12:32 pm
期待ing….
319962 said,
May 26, 2005 @ 2:49 pm
如果发布好UGiA Visual PHP Uploader,麻烦楼主MAIL一份给我.万分感谢
319962 said,
May 26, 2005 @ 2:50 pm
如果发布好UGiA Visual PHP Uploader,麻烦楼主MAIL一份给我.万分感谢
319962@163.com
legend said,
May 27, 2005 @ 9:19 am
现在还有几个问题,正在努力解决
matthew said,
May 29, 2005 @ 12:47 pm
support firewall?
legend said,
May 29, 2005 @ 2:06 pm
服务器有防火墙的话不行。
huang_dc said,
June 1, 2005 @ 9:48 am
弄好了希望能给我发一份,期待中。。。。hdc@wzcc.com
legend said,
June 1, 2005 @ 10:30 am
这个月没有时间继续做,等到七月份才有时间
思路已经说得很清楚了,大家可以尝试着自己做,或者我可以把未完成的代码贴出来。
hellon said,
June 1, 2005 @ 11:53 pm
贴出未完成的代码
学习
谢谢了
Axio said,
June 6, 2005 @ 1:25 pm
不错的东东。希望早日成功并且开放发布。支持。。。
Hart said,
June 10, 2005 @ 3:55 pm
也发一份给我吧,谢谢了阿
Hart said,
June 10, 2005 @ 3:57 pm
也发份给我吧,谢谢了
guest said,
June 21, 2005 @ 10:20 am
google search “upload-progress-meter-v4.1.tgz”
just by php
五帝 said,
July 23, 2005 @ 10:05 am
我用socket建立了几次监听都失败了,不知是否和 SP2 的防火墙有关
慕炎 said,
July 28, 2005 @ 6:04 pm
期待ing
ycym said,
August 4, 2005 @ 12:27 am
发一份给我吧,谢谢了。
redfox said,
August 4, 2005 @ 11:03 am
太期待了,也给我一份吧
vtsuper said,
August 5, 2005 @ 7:20 pm
good JOB!!!!!!!!!!!!!! support!!!!!
skyphd said,
August 8, 2005 @ 6:08 pm
迫切需要中…..
legend said,
September 8, 2005 @ 1:50 am
获取不到进度的问题初步找出原因,是ie对同一个站点的请求默认是两个(可能在不同的机器中不一样), 但是现在UVPU并发的是三个线程,导致最后的请求无法得到回应。
解决办法就是减少一个请求, 那就只有把创建服务器并接收数据的upload.php这个在创建完服务器后关掉,注意不是真正的关掉,是cancel掉ie的这个请求,但是upload.php仍在执行,用了ignore_user_abort,但是新问题又来了,万一上传过程中出现问题或者其他原因,upload.php就一直在运行,而无法关掉服务器端的这个进程…
UGiA.CN » 预告:UPU (UGiA PHP UPLOADER) said,
September 12, 2005 @ 2:43 am
[...] September 12, 2005 at 2:43 am · Filed under General 网站差不多两个月没更新了,该写点什么了,想来想去实在是没有什么好写的。 以前写过一个显示文件上 进度及上 任意大小的文件的类,我承诺过段时间完善之后发出来,但是有些问题卡住了,解决不了。也就没有再做下去。这 天有人问起这个,觉得再不做点什么就对不起大家了,呵呵。 [...]
UGiA.CN » UGiA PHP UPLOADER V0.2 发布 said,
September 12, 2005 @ 10:46 pm
[...] September 12, 2005 at 10:46 pm · Filed under Develop, PHP Develop [...]
feitiger said,
September 19, 2005 @ 2:33 pm
你这个的确是不错的创意!以前一直苦于php环境下没有大文件上传解决方案——看不到上传进度条啊,像asp利用abcupload等,.net也可以轻松实现上传进度条
Juan Manuel said,
November 4, 2005 @ 4:54 am
i´m mexican, i speak english, i´ve downloaded the upload aplication but i don´t understand how to configure it cuz it´s chinesse, i´ll look for english instructions, but if someone knows where to find the instructions i´ll apreciate it very very much, tnx :P
ertan said,
December 15, 2005 @ 2:19 am
@juan
english check : http://www.ugia.cn/?p=70
macleo said,
May 15, 2006 @ 5:11 pm
厉害啊!佩服!
Dream said,
June 30, 2006 @ 11:26 am
我用PHP+flex做了一个,呵呵,很简单就实现了
shareke said,
July 1, 2006 @ 10:10 pm
看见upu的确让我兴奋,只是遇到不少问题。不知道V0.3怎么样?legend能给我发一份么,感激啊。lrteng@gmail.com。期待中~~
xx said,
July 7, 2006 @ 8:13 pm
好像可以用flash来做,看看youtube的就是这样
legend said,
July 7, 2006 @ 8:34 pm
也需要后面程序配合的,youtube估计用的是Cold Fusion,如果用php,一样不容易。
韬 said,
September 22, 2006 @ 2:21 pm
我也要一份谢谢了lovest317@163.com
legend said,
September 22, 2006 @ 5:20 pm
http://www.ugia.cn/?p=30
支持你及你的东东 said,
October 5, 2006 @ 2:28 am
东西有没有可以正常使用的啊,有的话发一个给我,xdwang_82@hotmail.com
leo said,
October 10, 2006 @ 5:31 pm
我下了个0.2的。。本机做服务器是可以传,但放到服务器上(一样的系统,都是WIN2003),就传不了了。
一直都是。正在上传 。。。:
然后就不动了。
美播网 said,
October 19, 2006 @ 8:14 pm
美播网实现了各位所说的文件异步上传,同时显示上传进度条,非常cool。不信,大家试试:
美播网
美播网 said,
October 19, 2006 @ 8:33 pm
美播网
如果大家有耐心,在美播网简单注册一下,可以发现美播网显示的进度条非常cool。
美播网的使用实现方法是PHP+Ajax+Perl。使用PHP可以很容易获得临时文件大小,但是却不知道总的文件大小,所以需要Perl脚本。另外,Ajax用来实时更新上传进度。
欢迎各位回信一起讨论。
liuxi said,
December 16, 2006 @ 9:57 am
很想要啊
liuxi said,
December 16, 2006 @ 9:58 am
Nicholas1445@163.com
给我一份哈 谢谢!!!!!
cargo said,
December 21, 2006 @ 2:06 pm
这样的好东西应该开源
m said,
March 12, 2007 @ 3:42 pm
美播网就像屎一样到处拉,如果你真厉害,那你把代码共享,让人家注册看,真他妈不是东西
Hello said,
April 26, 2007 @ 2:05 pm
上头那位老兄,在下有同感也。
技术是实在的东西,不是裘千丈一样的银枪蜡样头。
我看还是先修身,再做事呀。
longbill said,
June 21, 2007 @ 4:39 pm
上传进度条用flash可以很轻松的实现,看这里
[url]http://longbill.cn/blog/index.php?id=68[/url]
oscar810429 said,
October 9, 2007 @ 9:43 pm
说实在感觉是好的!!但是服务请求过多,可以托死你的服务器!
我的一个网站是采用UPU这个上传工具,今天就是使我们几台服务器同时托死,而且socket请求一直卡那里,晕倒。。。
请问有没有好的解决方案,
现在我们只能在重新写一个上传工具不用socket….
虽说可以上传任意文件,但上有点怕了。。。。
BaiWenl said,
December 3, 2007 @ 12:11 pm
可找到一个功能完善的了,我找得好辛苦啊,呵呵!希望能够坚持下来。
baroc said,
December 27, 2007 @ 11:21 pm
作者好强
代码写的很好。
可惜没有一个简单,我的头好大。
孙晓辉 said,
December 29, 2007 @ 1:14 pm
作者大人,也给我来份吧!
sd11212655@gmail.com
星宿之间 said,
January 29, 2008 @ 7:52 pm
抱歉!昨天来了没有留下脚印,legend,支持你,向你学习!
星宿之间 said,
February 1, 2008 @ 12:53 pm
嗨!我发现一个问题,漏洞!
我们可以直接用浏览器打开upu/upload.php,再用getinfo.php获得临时服务器地址就可以随便上传文件了,怕怕。
qqkuge said,
September 10, 2008 @ 8:25 am
麻烦谁有的给我发一份,急需学习
qqkuge said,
September 10, 2008 @ 8:26 am
麻烦谁有的给我发一份,急需学习,qqkuge@163.com
feiyang33 said,
November 12, 2008 @ 9:24 pm
给我一份吧
TryLife said,
March 14, 2009 @ 6:07 am
这样的方法安全怎样
pushlau said,
August 5, 2009 @ 10:10 am
麻烦给我传一份吧,学习,谢谢!
pushlau@163.com
wade said,
March 8, 2010 @ 9:39 am
谁给我传一份吧,学习下,谢谢啦! linken1110@163.com
beggar said,
April 9, 2010 @ 1:18 pm
麻烦楼主给我mail一份,非常感谢!
beggar said,
April 9, 2010 @ 1:19 pm
麻烦楼主给我mail一份,非常感谢!tangyinmet2009@hotmail.com
请传我一份吧!谢谢 said,
August 4, 2010 @ 9:57 am
请传我一份吧!谢谢—-direnjie644@163.com