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


点击这里下载
407 viewed 83 comment(s)
pizzro            回复
2007年06月21号 05:39
这个东西不错
smallwl            回复
2007年06月23号 08:46
测试了一下。

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

这句去掉试试
风吟            回复
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";
      }
      ?>
longbill            回复
2007年08月19号 11:39
我那个里面的save.php只是一个样例而已啊,具体的完善方法和其他语言的保存代码都可以自己写。不过如果有什么不懂的可以问我。
hehec            回复
前年06月01日 19:42
提示:影片中的某个脚本导致adobe flash player 9 速度降低,如果继续运行,电脑将没有响应,是否要终止此脚本?


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

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


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

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

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

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

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

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

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

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

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

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

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

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

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