PHP+FLASH实现上传文件进度条!
June/20th 2007
PHP之所以很难实现上传进度条是因为在我们上传文件到服务器的时候,要等到文件全部送到服务器之后,才执行相应的php文件。在这之前,文件数据保存在一个临时文件里面,而php无法获得这个文件的路径及大小。
    从Actionscript 2.0开始,Flash支持文件上传及下载了。虽然不能在服务端获得文件上传进度,但我们可以在服务端获得文件的发送进度。根据这个原理,用Flash就能做出上传进度条效果。
    我在网上看到过一些资料,但是感觉有缺陷。于是自己研究了一下,在前人的基础上加强了程序的安全性和健壮性,并且增加了一些可自定义的参数。

    说明:如果你的电脑安装了防火墙软件,那么可能会看到进度条一下就100%的情况。这是因为进度条显示的是flash把文件传给防火墙软件的速度!防火墙还要再将数据传到服务器。
    演示请点击这里


本程序是Longbill 根据网上相关资料改进而成的
http://www.longbill.cn
Email: longbill.cn@gmail.com

调用参数说明(假设本flash名字为 upload.swf):

将flash文件的调用地址写成:
upload.swf?maxsize=[单个文件最大体积]&bgcolor=[进度条颜色]
&limit=[限制上传文件类型]&savefile=[上传对象文件]

[单个文件最大体积]:【可选】【数字】(单位为 KB)
[进度条颜色]: 【可选】【六位十六进制数字】【默认为随机颜色】(没有#的16位颜色值)
[限制上传文件类型]: 【可选】格式如: limit=zip|rar|doc
[上传对象文件]: 【默认为save.php】【字符串】

例如:
upload.swf?maxsize=2048&bgcolor=FF00FF&limit=jpg|gif|png&savefile=upsave.php


点击这里下载

8349 read 87 comment(s)
#1
pizzro   2007年06月21号 05:39       回复
这个东西不错
#2
smallwl   2007年06月23号 08:46       回复
测试了一下。

文件上存到哪个目录?提示文件上存失败。
#3
longbill   2007年06月23号 09:09       回复
这个只是测试,没有将上传的文件保存。上传文件失败可能与你的网络状况有关。
#4
woaiyali   2007年07月21号 10:37       回复
longbill
你好,安装之后,在win服务器上可以上传成功,
linux上是不是需要特别设置权限问题,类unix上都测试失败,传不上去。
#5
longbill   2007年07月22号 01:47       回复
这个原因可能是 你的linux主机的php配置有问题,你可以改一下那个 save.php 文件, 那个只是一个示例,可以改成其他的。
#6
woaiyali   2007年07月22号 23:17       回复
关键是不会改啊,老弟
#7
wwd   2007年07月29号 11:57       回复
我试了一下,不行啊,flash并没有把文件传给php文件啊? 
#8
dreamblaze   2007年07月30号 18:33       回复
同4楼的,LINUX服务器传不了,不知兄弟是否有解决办法?如果解决的话能否给我邮箱发一份,我对FLASH实在是一窍不通
#9
dreamblaze   2007年07月30号 18:39       回复
save.php已经改成这样了
foreach($_FILES as $f)
    {
        
        //处理中文名
        if (function_exists("iconv"))  $f[name] = iconv("UTF-8","GB2312",$f[name]);
        //检查是否已经存在同名文件
        if (file_exists($f[name]))  echo "";
        //保存文件
        if (!@move_uploaded_file($f["tmp_name"],'/www/hmt/system/flashup/files/'.$f[name]))  echo"上传失败";
    }
files文件夹属性也改为777了,上传能显示进度条
,并且能显示上传成功,但是在那个文件夹里却没有上传的文件,不知道什么原因
#10
longbill   2007年08月01号 01:08       回复
很可能是你的主机内码不是中文的,你可以把
//处理中文名
            if (function_exists("iconv"))  $f[name] = iconv("UTF-8","GB2312",$f[name]);

这句去掉试试
#11
风吟   2007年08月18号 20:32       回复

替换如下代码可以增加安全性到99% files请改为你的设置的文件名(尽量设置复杂)如果可能请取消 对你设置对应目录的 php asp cgi 等执行权限.这样安全就 100了%,不过还是希望作者可以完善一下!对大家负责.既然发出来了
<?php
foreach($_FILES as $f)
      {
            
            //处理中文名
            if (function_exists("iconv"))  $f[name] = iconv("UTF-8","GB2312",$f[name]);
            //检查是否已经存在同名文件
            if (file_exists($f[name]))  echo "";
            //保存文件
            if (!@move_uploaded_file($f["tmp_name"],'files/'.$f[name]))  echo"1";
      }
      ?>
#12
longbill   2007年08月19号 11:39       回复
我那个里面的save.php只是一个样例而已啊,具体的完善方法和其他语言的保存代码都可以自己写。不过如果有什么不懂的可以问我。
#13
hehec   2008年06月01号 19:42       回复
提示:影片中的某个脚本导致adobe flash player 9 速度降低,如果继续运行,电脑将没有响应,是否要终止此脚本?


修改了点代码,但上传文件再大一点(100M)左右还是一样会有上面的提示。longbill 能不能看看什么问题告诉大家一下。
#14
longbill   2008年06月01号 23:39       回复
这个问题暂时还不能解决。是 flash player 的保护机制。
#15
lemon   2007年09月11号 18:37       回复
能否做个asp的,蓝色论坛里看了下,asp的在IIS下不是很好用的!
lemonweb@163.com
可否给小弟一份
#16
Neaton   2007年09月22号 09:49       回复
安全性很差吧!!
只要我下载表单,将limit_type修改成我想上传的格式,一切都O了!
甚至可以修改save.php为自己想要的文件,这不就可以得到别人上传的文件啦??
#17
longbill   2007年09月23号 17:40       回复
回楼上:
limit_type只是一个简单的文件选择过滤,主要的安全性过滤是要靠save.php来实现。我做的save.php只是一个例子。你可以在此基础上修改一下,可以加一个文件类型判断。
#18
hakula   2007年10月07号 11:13       回复
不知道这个可以用JSP不?不用PHP,用JSP的话又怎样改哦,请指教。。。还有这个最大能上传多大的文件?
#19
longbill   2007年10月07号 18:23       回复
用jsp是可以的,但我不知道怎么写啊,我没有学过jsp。上传文件最大取决于服务端,比如一般php服务端限制为2M
#20
psdshow   2007年10月18号 18:42       回复
我的在linux下也是上传失败
在本地windows下使用正常.
#21
Tony   2007年10月21号 12:14       回复
貌似我上传800M的文件,提示我很多次Js脚本占用资源过多,问是否关闭!
#22
Tony   2007年10月21号 12:14       回复
我是本机测试的
#23
candysfm   2007年10月31号 17:38       回复
现在需要请教你,现在上传全部成功,我怎么返回上传后的文件名???
#24
Longbill   2007年10月31号 20:12       回复
flash无法得到返回的信息~
我也没有办法
#25
游客   2007年11月01号 12:12       回复
上传的默认目录是那里呢。。。
flash传给php的是_FILES变量吗 我用jsp取不到_FILES  郁闷
#26
longbill   2007年11月02号 17:36       回复
我做的示例文件上传默认目录是 ./
,jsp里面应该有相应的函数或者变量之类的。你可以查一下。
#27
tim   2007年11月06号 19:50       回复
upload.fla   Flash源程序我用 Flash MX 2004打不
#28
mdy   2007年12月04号 21:16       回复
出现错误了:

提示:影片中的某个脚本导致adobe flash player 9 速度降低,如果继续运行,电脑将没有响应,是否要终止此脚本?


我的php可以上传200m,我只是上传了15m的东西,就出现了这个提示框,请问怎么回事,如何改正,谢了
#29
AJan   2007年12月30号 15:06       回复

 你blog上木马, 好险啊,我开了卡巴,要不然我完了

 
#30
longbill   2007年12月31号 09:38       回复
哇,果然是啊,幸亏我是ie7,不然我也完了。现在好了,我去掉了。
#31
Felix021   2008年03月01号 05:26       回复
这个很不错.
关于这个我给你发了封邮件,有我的一些修改和建议
#32
pp18180058   2008年05月17号 03:11       回复
没有框架(iframe)和session的时候一切正常~~

我在框架内,上传是成功了,但session丢失了~~
#33
longbill   2008年05月18号 01:02       回复
session应该和框架没有什么关系吧。
#34
银狐一剑   2008年07月17号 10:13       回复
请问如何在上传的时候再多带一个参数,传给 upsave.php
#35
longbill   2008年07月19号 13:28       回复
引用flash的时候,在地址上多加一个参数就可以了
#36
我本沉默   2008年07月30号 21:33       回复
不能传给upsave.php 可以考虑直接在FLASH里面用geturl()执行Javascript函数,把文件名传到表单,文件名和save.php的同步则可以把FLASH里面的名称和SAVE最终保存的名称重命名成相同的,如果怕重复,可以在前面加日期和、小时、分钟
#37
longbill   2008年07月30号 23:48       回复
楼上什么意思?
是不是flash传给upsave.php的文件名是乱码?
那是因为flash传过去的是utf-8编码的文件名。iconv一下就可以了。
#38
zeze   2008年08月07号 00:48       回复
我电脑上本地测试提示上传成功,但是相应目录下找不到上传的文件,不知为何?
#39
Guest   2008年08月12号 02:12       回复
不错不错。。。
#40
Guest   2008年08月18号 00:06       回复
FF3下测试失败!
#41
longbill   2008年08月18号 13:46       回复
怎么会!我现在用的就是ff3
#42
Guest   2008年09月03号 14:05       回复
试了一下,很好用
能不能把上传做的提交表单一起啊?
#43
longbill   2008年09月05号 02:31       回复
上传不能和表单做到一起。除非你用js控制。
#44
好好学习   2008年09月09号 17:46       回复
我使的IE6 ,也显示文件上传失败。为什么?用的WINDOWS平台~
#45
Guest   2008年09月20号 16:01       回复
你好,使用你的例子后,我不知道上传的文件保存到了哪里。
可不请指点一下。
#46
Guest   2008年10月08号 11:42       回复
已经收藏,谢谢分享

http://bolm.cn/go.php?id=215
#47
ABO   2008年10月09号 13:02       回复
你好,当不使用foreach,不加检查文件是否重复时,使用如下语句发现提示上传成功后却找不到文件。

$uploadfilename    = $_FILES[file]['name'];
move_uploaded_file($_FILES[file]['tmp_name'], $uploadfile);

请问是否知道是什么问题吗?
#48
Guest   2008年10月11号 21:31       回复
楼上的 一个数组不遍历出来 当然取不到了
#49
Guest   2008年10月23号 17:45       回复
哎,没啥说的,功能是完成了!只是有点欠佳!
比如,自动命令功能,返回文件名称,还有多文件上传,还有flash 可以否给用cs的,这样我们直接改cs文件。哎,等等等!。。。。。。
#50
Guest   2008年10月25号 14:34       回复
请问我把这个FLASH的上传文件最大设置成200M,但是我上传的文件最大只有40M,超过后FLASH提示可以上传成功,但是PHP取得不到值,请问是怎么回事呢?哪位朋友知道的请帮帮忙,万分感谢。俺的QQ:52421075
#51
longbill   2008年10月25号 15:36       回复
上传文件的最大值需要在 php.ini中设置。
#52
楚狂人   2008年11月15号 09:44       回复
上傳之後的檔案路徑哪邊可以更改呢?
以及檔案的暫存名稱以及上傳到伺服器的名稱要如何更改
因為我想記錄在我的資料庫中,之後提供檔案下載
所以需要知道上傳的檔名以及如何連結路徑
#53
longbill   2008年11月15号 11:20       回复
保存的文件名可以在save.php里面修改。其实flash上传跟一般的网页上传后的处理方式是一样的。文件信息都保存在$_FILES里面了。
#54
Guest   2008年11月23号 21:38       回复
这个程序明显有安全问题,php毫无任何检验过程。
#55
Guest   2008年12月01号 19:51       回复
你不知道自己写啊?这么简单的东西还说有安全问题,我看你人才有问题
#56
longbill   2008年12月01号 20:21       回复
多谢楼上兄台解围~~~
#57
xiahui   2008年12月04号 16:04       回复
东西不错,你的论坛发展也很不错哦,好久没上了
#58
Guest   2008年12月16号 17:09       回复
很强的东西。支持您。
#59
cheen.cn   2009年01月02号 18:36       回复
兄弟呀。。。。你可害惨了我了。。。。

因为用这个东西。。被入侵了。。。

看来这个上传的东西没有被验证。。。

以后还是不要用了。。。
#60
longbill   2009年01月03号 13:26       回复
晕啊,怎么你们都直接拿来用啊。我那个save.php只是做个演示而已。详细的验证过程需要 使用者根据自身需要来写啊。
#61
Guest   2009年01月06号 15:53       回复
为什么我的上传后 在服务器上面找不到文件了?
#62
longbill   2009年01月07号 11:45       回复
请先确定你的php有对目录的写权限。
#63
lizhifeng   2009年01月23号 20:54       回复
最好就做出个实例来,不然不安心。而且要做就做下去啊。干吗做到一半呢~?
#64
Guest   2009年02月08号 11:49       回复
能否将表单中的其他内容一起提交呢
#65
longbill   2009年02月08号 21:23       回复
不行。这个flash只能单独上传文件。
#66
Guest   2009年02月21号 17:41       回复
src="upload.swf?savefile=inc/save_sone.php&maxsize=10240&bgcolor=4499EE&limit=wma|mp3&id=88"

我在后面写了个id=88
然后在SAVE.PHP里面写
$id = $_GET["id"];
if(!file_exists($id))
{
mkdir($id);
}
但是为什么没有创建文件夹?怎么接收src里面的id值过来呢?
#67
longbill   2009年02月22号 02:00       回复
src="upload.swf?savefile=inc/save_sone.php?id=88&maxsize=10240&bgcolor=4499EE&limit=wma|mp3"

这样写
#68
Guest   2009年04月06号 15:27       回复
src="upload.swf?savefile=inc/save_sone.php?id=88&maxsize=10240&bgcolor=4499EE&limit=wma|mp3"

这样写    传不了值
#69
大大声的   2009年06月29号 02:33       回复
文件大了就失败了
#70
longbill   2009年06月29号 03:14       回复
回复 大大声的: 
文件大了会受很多因素的影响,比如php.ini里面设置的最大上传文件的大小。一般来说是2M。大于这个数值的文件是传不上去的。
#71
dutha   2009年07月15号 00:56       回复
不错
#72
zzx   2009年08月09号 09:46       回复
遇到了些问题:
1、save.php在firefox环境下中不能得到session
2、function _onUploadError(name),好像我们控制不到吧,如不能在save.php里面处理。
3、上传完成后,怎么返回经save.php处理后的文件名。
#73
有疑问   2009年08月09号 11:13       回复
怎么传递参数,想传个用户名过去啊!。
#74
longbill   2009年08月11号 09:15       回复
回复 有疑问: 
传个session_id就行了啊。
#75
zzx   2009年08月12号 05:20       回复
请问:能不能设置最小文件大小:minsize?
#76
longbill   2009年08月12号 05:43       回复
回复 zzx: 
不能。
#77
zzx   2009年08月13号 06:49       回复
前一段时间不是有个可以处理js的方法,当上传成功时,输出一段文字,function _onUploadComplete(name, size)
好像现在的下载压缩包里面没有了,能否提供一下源代码?zzx0312@163.com
#78
longbill   2009年08月13号 06:53       回复
回复 zzx: 
推荐使用swfupload,那个要强大得多。http://www.v-sky.com/doc/swfupload/v2.1.0/Documentation.html#swfupload
#79
xxx   2009年08月24号 00:36       回复
我上传大于4M的文件就不能上传,怎么回事?
#80
longbill   2009年08月24号 17:25       回复
回复 xxx: 
php服务器的限制。
#81
guest   2009年09月16号 07:33       回复
回复 longbill: 
问题比较多。。。
#82
guest   2009年09月16号 07:34       回复
1. 不能传值;2. linux下保存有问题
作者估计在有些环境下没有测试
#83
guest   2009年09月16号 08:18       回复
回复 Guest: 
确实如此
#84
guest   2011年07月15号 18:58       回复
文件上传成功了,怎样把文件名保存或递到表单?
#85
shan   2011年10月26号 16:16       回复
怎么修改文件名为日期+随机数?
不让上传的文件名重复
#86
SUNSHING   2011年11月25号 16:37       回复
很好,顶下,
#87
php程序员   2012年03月17号 16:13       回复
不支持火狐  不支持google浏览器呀 
添加新的评论
称呼:*
邮件:*
网站:
内容:

Copyright © Longbill 2008-2024 , Designed by EndTo , Powered by EndCMS