PHP+FLASH实现上传文件进度条!
June/20th 2007
PHP之所以很难实现上传进度条是因为在我们上传文件到服务器的时候,要等到文件全部送到服务器之后,才执行相应的php文件。在这之前,文件数据保存在一个临时文件里面,而php无法获得这个文件的路径及大小。
从Actionscript 2.0开始,Flash支持文件上传及下载了。虽然不能在服务端获得文件上传进度,但我们可以在服务端获得文件的发送进度。根据这个原理,用Flash就能做出上传进度条效果。
我在网上看到过一些资料,但是感觉有缺陷。于是自己研究了一下,在前人的基础上加强了程序的安全性和健壮性,并且增加了一些可自定义的参数。
说明:如果你的电脑安装了防火墙软件,那么可能会看到进度条一下就100%的情况。这是因为进度条显示的是flash把文件传给防火墙软件的速度!防火墙还要再将数据传到服务器。
演示请点击这里
点击这里下载
8455 read 87 comment(s)
从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
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
点击这里下载
8455 read 87 comment(s)
添加新的评论
称呼:*邮件:*
网站:
内容:
文件上存到哪个目录?提示文件上存失败。
你好,安装之后,在win服务器上可以上传成功,
linux上是不是需要特别设置权限问题,类unix上都测试失败,传不上去。
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了,上传能显示进度条
,并且能显示上传成功,但是在那个文件夹里却没有上传的文件,不知道什么原因
//处理中文名
if (function_exists("iconv")) $f[name] = iconv("UTF-8","GB2312",$f[name]);
这句去掉试试
替换如下代码可以增加安全性到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";
}
?>
修改了点代码,但上传文件再大一点(100M)左右还是一样会有上面的提示。longbill 能不能看看什么问题告诉大家一下。
lemonweb@163.com
可否给小弟一份
只要我下载表单,将limit_type修改成我想上传的格式,一切都O了!
甚至可以修改save.php为自己想要的文件,这不就可以得到别人上传的文件啦??
limit_type只是一个简单的文件选择过滤,主要的安全性过滤是要靠save.php来实现。我做的save.php只是一个例子。你可以在此基础上修改一下,可以加一个文件类型判断。
在本地windows下使用正常.
我也没有办法
flash传给php的是_FILES变量吗 我用jsp取不到_FILES 郁闷
,jsp里面应该有相应的函数或者变量之类的。你可以查一下。
提示:影片中的某个脚本导致adobe flash player 9 速度降低,如果继续运行,电脑将没有响应,是否要终止此脚本?
我的php可以上传200m,我只是上传了15m的东西,就出现了这个提示框,请问怎么回事,如何改正,谢了
你blog上木马, 好险啊,我开了卡巴,要不然我完了
关于这个我给你发了封邮件,有我的一些修改和建议
我在框架内,上传是成功了,但session丢失了~~
是不是flash传给upsave.php的文件名是乱码?
那是因为flash传过去的是utf-8编码的文件名。iconv一下就可以了。
能不能把上传做的提交表单一起啊?
可不请指点一下。
http://bolm.cn/go.php?id=215
$uploadfilename = $_FILES[file]['name'];
move_uploaded_file($_FILES[file]['tmp_name'], $uploadfile);
请问是否知道是什么问题吗?
比如,自动命令功能,返回文件名称,还有多文件上传,还有flash 可以否给用cs的,这样我们直接改cs文件。哎,等等等!。。。。。。
以及檔案的暫存名稱以及上傳到伺服器的名稱要如何更改
因為我想記錄在我的資料庫中,之後提供檔案下載
所以需要知道上傳的檔名以及如何連結路徑
因为用这个东西。。被入侵了。。。
看来这个上传的东西没有被验证。。。
以后还是不要用了。。。
我在后面写了个id=88
然后在SAVE.PHP里面写
$id = $_GET["id"];
if(!file_exists($id))
{
mkdir($id);
}
但是为什么没有创建文件夹?怎么接收src里面的id值过来呢?
这样写
这样写 传不了值
文件大了会受很多因素的影响,比如php.ini里面设置的最大上传文件的大小。一般来说是2M。大于这个数值的文件是传不上去的。
1、save.php在firefox环境下中不能得到session
2、function _onUploadError(name),好像我们控制不到吧,如不能在save.php里面处理。
3、上传完成后,怎么返回经save.php处理后的文件名。
传个session_id就行了啊。
不能。
好像现在的下载压缩包里面没有了,能否提供一下源代码?zzx0312@163.com
推荐使用swfupload,那个要强大得多。http://www.v-sky.com/doc/swfupload/v2.1.0/Documentation.html#swfupload
php服务器的限制。
问题比较多。。。
作者估计在有些环境下没有测试
确实如此
不让上传的文件名重复