【原】php批量上传文件的三种方法,附带源码和解析
发表于2014-08-29 15:54 | 次阅读 | 0条评论 | 作者:admin
最近开发中涉及批量上传图片的功能,当时想着挺复杂的,做完再看其实也不过如此,现总结如下:
批量上传有三种方法,看你业务的需求而定。
一、允许多个<input type="file">存在,页面采用数组形式接收值,php处理用$_FILE["upload"]获取
html
<form
enctype="multipart/form-data">
<input type="file" name="upload[]">
<input type="file" name="upload[]">
</form>
php处理
注意使用$_FILE["upload"]获取参数的数据结构,$_FILES["upload"]默认是一个数组,多个文件的数据结构如下,假如上传了2个文件
$_FILES["upload"]["name"]
[0]
$_FILES["upload"]["name"]
[1]
...其他同样
二、利用<input type="file"
multiple="multiple">的属性值
multiple:表示一个input域 可以同时点击多个文件上传
php处理:如上
三、
如果你的需求是只上传几个文件,第一,第二个够了,假如:你的业务需要几兆的文件呢?此时第一和第二个方法不够用了
可以上传压缩文件,但此时上传之后,你需要解压,循环遍历解压文件,获取里面的文件,下面来讲解下具体的方法
思路:
把需要上传的文件打包上传,上传到服务器后解压文件
循环遍历解压文件,判断是不是需要的文件,是则用数组记录
遍历数组,获取单个文件,之后就看你的业务需求了
下面贴出主要的
php代码:(该列子是获取压缩文件中所有的图片和swf格式的flash)
$tmp_name = explode("/", $uploadPic["tmp_name"]);
$tmp_name = array_pop($tmp_name);
$tmp_name = $tmp_name."_".rand()."_".time();
$upfile = "php/upload/{$tmp_name}.{$ext}";
if (!move_uploaded_file($uploadPic["tmp_name"], $upfile))
{
CommUtils::resOut("-1", "上传文件到目标路径失败");
return;
}
$tmp_name = "php/upload/{$tmp_name}/";
exec("7za x {$upfile} -r -y -o{$tmp_name}"); /*解压缩时会自动新建目录*/ //如果不是linux系统另外想办法
if(file_exists($tmp_name)) //解压成功后删除对应的7z文件
unlink($upfile);
$arrfile = CommUtils::getMaterials($tmp_name); //遍历获取7z解压缩文件里面的所有图片和flash并记录到数组中
if(count($arrfile) == 0)
{
CommUtils::resOut("-1", "上传文件中没有素材。");
exec("rm -rf {$tmp_name}");
return;
}
public static function getMaterials($path) /*获取指定目录下的所有素材*/
{
$result = array();
foreach (glob($path.'/*') as $file)
{
if (is_dir($file))
$result = array_merge($result, self::getMaterials($file));
else
{
$info = explode(".", $file);
if (count($info) < 2) /*防止出现类似于"7z"、"swf"等没有扩展名的文件名*/
continue;
$ext = strtolower($info[count($info) - 1]); /*扩展名*/
if ("gif" == $ext || "jpeg" == $ext || "jpg" == $ext ||
"png" == $ext || "bmp" == $ext || "swf" == $ext)
$result[] = $file;
else if ("7z" == $ext)
{
/*
【1】pathinfo()遇到含有"-"字符的中文文件名时有bug,7za解压缩时也会有这个问题
【2】pathinfo()遇到中文文件名时,获取的"basename"也会有问题,有时会出现只取到了扩展名,
前面的中文文件名丢失了
*/
$filepath = $path."/".rand()."_".rand()."_".time();
exec('7za x "'.$file.'" -r -y -o"'.$filepath.'"');
$result = array_merge($result, self::getMaterials($filepath));
}
}
}
return $result;
}
思路就是这样
注意,如果上传的文件过大,需加上这两句
set_time_limit(0);
ini_set("memory_limit", "-1");
处理批量上传的控制器的PHP里需要加上这2个,去掉时间、内存的方面的限制,不然超时PHP进程就会被杀死
PHP默认的最长执行时间是30秒,超时就会被杀死