【原】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秒,超时就会被杀死

本站关键字:sunny90 web开发 数据库 移动开发 服务器 Nginx Mysql PHP
Copyright © sunny90版权所有 power by sunny90.com  
湘ICP备14012284号-1,粤公网安备 44030602000307号