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, 这样大家就可以在程序中很方便的调用了。效果如下:

uvpu

64 Comments »

  1. shishirui said,

    May 2, 2005 @ 12:29 pm

    非常期待!!!

  2. safer said,

    May 3, 2005 @ 12:55 am

    希望发布得时候,可以 gmail 发份给我。谢谢

  3. Jimmy said,

    May 3, 2005 @ 1:18 pm

    期待啊~~~

  4. andot said,

    May 5, 2005 @ 2:35 pm

    太棒了。跟bindows整合到一块就更好了。bindows正好没有文件上传组件呢。不过用对话框不太好。只能用在IE上。

  5. tsing said,

    May 6, 2005 @ 3:01 pm

    sf上有一个类似的:Mega Upload Progress Bar
    http://sourceforge.net/projects/megaupload/

  6. legend said,

    May 6, 2005 @ 3:56 pm

    Mega Upload需要perl

    现在有几个问题需要解决
    一个是上传时,用xmlhttp或者替换script src的方式获取进度,在开始向临时服务器post数据时,会打不开页面,难道会是“阻塞”?但是通过代理服务器就可以 !-_-, 所以可能需要用其他方式来获取进度信息,初步考虑用flash

    第二个是由于http协议的不可靠,上传会中断…

    第三个是上传中途用户取消或者其他原因,留下好多垃圾,还得写垃圾回收

  7. Dennis said,

    May 10, 2005 @ 12:32 pm

    期待ing….

  8. 319962 said,

    May 26, 2005 @ 2:49 pm

    如果发布好UGiA Visual PHP Uploader,麻烦楼主MAIL一份给我.万分感谢

  9. 319962 said,

    May 26, 2005 @ 2:50 pm

    如果发布好UGiA Visual PHP Uploader,麻烦楼主MAIL一份给我.万分感谢

    319962@163.com

  10. legend said,

    May 27, 2005 @ 9:19 am

    现在还有几个问题,正在努力解决

  11. matthew said,

    May 29, 2005 @ 12:47 pm

    support firewall?

  12. legend said,

    May 29, 2005 @ 2:06 pm

    服务器有防火墙的话不行。

  13. huang_dc said,

    June 1, 2005 @ 9:48 am

    弄好了希望能给我发一份,期待中。。。。hdc@wzcc.com

  14. legend said,

    June 1, 2005 @ 10:30 am

    这个月没有时间继续做,等到七月份才有时间

    思路已经说得很清楚了,大家可以尝试着自己做,或者我可以把未完成的代码贴出来。

  15. hellon said,

    June 1, 2005 @ 11:53 pm

    贴出未完成的代码
    学习

    谢谢了

  16. Axio said,

    June 6, 2005 @ 1:25 pm

    不错的东东。希望早日成功并且开放发布。支持。。。

  17. Hart said,

    June 10, 2005 @ 3:55 pm

    也发一份给我吧,谢谢了阿

  18. Hart said,

    June 10, 2005 @ 3:57 pm

    也发份给我吧,谢谢了

  19. guest said,

    June 21, 2005 @ 10:20 am

    google search “upload-progress-meter-v4.1.tgz”
    just by php

  20. 五帝 said,

    July 23, 2005 @ 10:05 am

    我用socket建立了几次监听都失败了,不知是否和 SP2 的防火墙有关

  21. 慕炎 said,

    July 28, 2005 @ 6:04 pm

    期待ing

  22. ycym said,

    August 4, 2005 @ 12:27 am

    发一份给我吧,谢谢了。

  23. redfox said,

    August 4, 2005 @ 11:03 am

    太期待了,也给我一份吧

  24. vtsuper said,

    August 5, 2005 @ 7:20 pm

    good JOB!!!!!!!!!!!!!! support!!!!!

  25. skyphd said,

    August 8, 2005 @ 6:08 pm

    迫切需要中…..

  26. legend said,

    September 8, 2005 @ 1:50 am

    获取不到进度的问题初步找出原因,是ie对同一个站点的请求默认是两个(可能在不同的机器中不一样), 但是现在UVPU并发的是三个线程,导致最后的请求无法得到回应。
    解决办法就是减少一个请求, 那就只有把创建服务器并接收数据的upload.php这个在创建完服务器后关掉,注意不是真正的关掉,是cancel掉ie的这个请求,但是upload.php仍在执行,用了ignore_user_abort,但是新问题又来了,万一上传过程中出现问题或者其他原因,upload.php就一直在运行,而无法关掉服务器端的这个进程…

  27. UGiA.CN » 预告:UPU (UGiA PHP UPLOADER) said,

    September 12, 2005 @ 2:43 am

    [...] September 12, 2005 at 2:43 am · Filed under General 网站差不多两个月没更新了,该写点什么了,想来想去实在是没有什么好写的。 以前写过一个显示文件上 进度及上 任意大小的文件的类,我承诺过段时间完善之后发出来,但是有些问题卡住了,解决不了。也就没有再做下去。这 天有人问起这个,觉得再不做点什么就对不起大家了,呵呵。 [...]

  28. 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 [...]

  29. feitiger said,

    September 19, 2005 @ 2:33 pm

    你这个的确是不错的创意!以前一直苦于php环境下没有大文件上传解决方案——看不到上传进度条啊,像asp利用abcupload等,.net也可以轻松实现上传进度条

  30. 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

  31. ertan said,

    December 15, 2005 @ 2:19 am

    @juan
    english check : http://www.ugia.cn/?p=70

  32. macleo said,

    May 15, 2006 @ 5:11 pm

    厉害啊!佩服!

  33. Dream said,

    June 30, 2006 @ 11:26 am

    我用PHP+flex做了一个,呵呵,很简单就实现了

  34. shareke said,

    July 1, 2006 @ 10:10 pm

    看见upu的确让我兴奋,只是遇到不少问题。不知道V0.3怎么样?legend能给我发一份么,感激啊。lrteng@gmail.com。期待中~~

  35. xx said,

    July 7, 2006 @ 8:13 pm

    好像可以用flash来做,看看youtube的就是这样

  36. legend said,

    July 7, 2006 @ 8:34 pm

    也需要后面程序配合的,youtube估计用的是Cold Fusion,如果用php,一样不容易。

  37. 韬 said,

    September 22, 2006 @ 2:21 pm

    我也要一份谢谢了lovest317@163.com

  38. legend said,

    September 22, 2006 @ 5:20 pm

    http://www.ugia.cn/?p=30

  39. 支持你及你的东东 said,

    October 5, 2006 @ 2:28 am

    东西有没有可以正常使用的啊,有的话发一个给我,xdwang_82@hotmail.com

  40. leo said,

    October 10, 2006 @ 5:31 pm

    我下了个0.2的。。本机做服务器是可以传,但放到服务器上(一样的系统,都是WIN2003),就传不了了。
    一直都是。正在上传 。。。:
    然后就不动了。

  41. 美播网 said,

    October 19, 2006 @ 8:14 pm

    美播网实现了各位所说的文件异步上传,同时显示上传进度条,非常cool。不信,大家试试:

    美播网

  42. 美播网 said,

    October 19, 2006 @ 8:33 pm

    美播网
    如果大家有耐心,在美播网简单注册一下,可以发现美播网显示的进度条非常cool。
    美播网的使用实现方法是PHP+Ajax+Perl。使用PHP可以很容易获得临时文件大小,但是却不知道总的文件大小,所以需要Perl脚本。另外,Ajax用来实时更新上传进度。

    欢迎各位回信一起讨论。

  43. liuxi said,

    December 16, 2006 @ 9:57 am

    很想要啊

  44. liuxi said,

    December 16, 2006 @ 9:58 am

    Nicholas1445@163.com
    给我一份哈 谢谢!!!!!

  45. cargo said,

    December 21, 2006 @ 2:06 pm

    这样的好东西应该开源

  46. m said,

    March 12, 2007 @ 3:42 pm

    美播网就像屎一样到处拉,如果你真厉害,那你把代码共享,让人家注册看,真他妈不是东西

  47. Hello said,

    April 26, 2007 @ 2:05 pm

    上头那位老兄,在下有同感也。
    技术是实在的东西,不是裘千丈一样的银枪蜡样头。
    我看还是先修身,再做事呀。

  48. longbill said,

    June 21, 2007 @ 4:39 pm

    上传进度条用flash可以很轻松的实现,看这里
    [url]http://longbill.cn/blog/index.php?id=68[/url]

  49. oscar810429 said,

    October 9, 2007 @ 9:43 pm

    说实在感觉是好的!!但是服务请求过多,可以托死你的服务器!
    我的一个网站是采用UPU这个上传工具,今天就是使我们几台服务器同时托死,而且socket请求一直卡那里,晕倒。。。
    请问有没有好的解决方案,
    现在我们只能在重新写一个上传工具不用socket….
    虽说可以上传任意文件,但上有点怕了。。。。

  50. BaiWenl said,

    December 3, 2007 @ 12:11 pm

    可找到一个功能完善的了,我找得好辛苦啊,呵呵!希望能够坚持下来。

  51. baroc said,

    December 27, 2007 @ 11:21 pm

    作者好强

    代码写的很好。

    可惜没有一个简单,我的头好大。

  52. 孙晓辉 said,

    December 29, 2007 @ 1:14 pm

    作者大人,也给我来份吧!
    sd11212655@gmail.com

  53. 星宿之间 said,

    January 29, 2008 @ 7:52 pm

    抱歉!昨天来了没有留下脚印,legend,支持你,向你学习!

  54. 星宿之间 said,

    February 1, 2008 @ 12:53 pm

    嗨!我发现一个问题,漏洞!

    我们可以直接用浏览器打开upu/upload.php,再用getinfo.php获得临时服务器地址就可以随便上传文件了,怕怕。

  55. qqkuge said,

    September 10, 2008 @ 8:25 am

    麻烦谁有的给我发一份,急需学习

  56. qqkuge said,

    September 10, 2008 @ 8:26 am

    麻烦谁有的给我发一份,急需学习,qqkuge@163.com

  57. feiyang33 said,

    November 12, 2008 @ 9:24 pm

    给我一份吧

  58. TryLife said,

    March 14, 2009 @ 6:07 am

    这样的方法安全怎样

  59. pushlau said,

    August 5, 2009 @ 10:10 am

    麻烦给我传一份吧,学习,谢谢!
    pushlau@163.com

  60. wade said,

    March 8, 2010 @ 9:39 am

    谁给我传一份吧,学习下,谢谢啦! linken1110@163.com

  61. beggar said,

    April 9, 2010 @ 1:18 pm

    麻烦楼主给我mail一份,非常感谢!

  62. beggar said,

    April 9, 2010 @ 1:19 pm

    麻烦楼主给我mail一份,非常感谢!tangyinmet2009@hotmail.com

  63. 请传我一份吧!谢谢 said,

    August 4, 2010 @ 9:57 am

    请传我一份吧!谢谢—-direnjie644@163.com

  64. jql said,

    January 12, 2016 @ 3:35 pm

    你好,我最近也在学习这方面的东西,麻烦发一份源码吧,不胜感谢!或者给出github地址也行,方便大家学习。

RSS feed for comments on this post

Leave a Comment