spt119 发表于 2015-9-18 11:11:16

多文件上传的解决方法

很久没发帖了,今天来发一枚。
---------------------------------------------------
关于多文件上传的问题,在CI的框架下仅有单文件才能使用上传类。
为了解决多文件的上传,有几个方案:
1、更改CI上传类代码,指定input type=file的表单域名称,由userfile变成userfile[]。
2、借用在线编辑器的上传功能
3、集成javascript(如jQuery)的上传类,类似的有uploadify,swfupload。
4、使用php自带的多文件上传函数。

在我个人看来,方案1对单文件的兼容不好。如果都是多文件上传可以使用。方案2方法简单,如果无特殊管理需要则无妨。但如果需要管理编辑器上传的内容并与程序整合,则需要较大量的代码,不太划算。方案3也存在与程序的整合过程,而且有些自带flash方案的,与程序整体的美工效果和谐也是个大问题。方案4是笨方法,且代码量最少,且最容易与程序整合,便于上传内容的组织与管理,因此本文介绍下使用php自带的多文件上传的方法。

1、准备
其实所谓的准备,就是在前段input type=file的表单域中,加入multiple="multiple",同时需要将表单域的名称更改为数组格式。前提是你的表单已定义好“enctype="multipart/form-data"”。
代码:<input type="file" name="userfile[]" multiple="multiple" />
2、php的函数
多文件上传所需的函数基本就是两个:is_uploaded_file和move_uploaded_file。
另外还有一个超全局变量$_FILES。
3、上传文件的处理
(1)使用$_FILES判断是否有上传内容。如使用if (! empty($_FILES)){ 处理代码…… }
(2)使用is_uploaded_file函数判断指定的文件已上传到服务器临时文件中。
(3)使用move_uploaded_file将上传在服务器临时文件夹中的文件转移到指定的目录。
4、$_FILES的键名介绍
$_FILES变量包含如下键名:
(1)name:原文件名
(2)tmp_name:上传到服务器临时文件夹后,由服务器对文件的重命名。(当然这只是个临时文件)
(3)type:上传文件的扩展名mime。
(4)size:上传文件的大小,单位是字节。
(5)error:上传时的错误代码。(具体请参考php手册)
5、上传文件的处理
因为上传的文件至少是1个,所以需要循环处理每一个上传文件。请见下列代码
foreach((array)$_FILES['userfile']['tmp_name'] as $k => $v) { //userfile是前段表单域的name。使用tmp_name而不是name作为循环依据,原因是有可能上传文件是中文名。在Linux系统中中文文件名支持的不好。
    if (is_uploaded_file($_FILES['userfile']['tmp_name'][$k])) {
      $path = './upload/'; //这里的upload文件夹与CI的index.php在同级目录下。
      $file_name = $_FILES['userfile']['name'][$k];
      $file_name = explode('.',$file_name);
      $upload_name = date('YmdHis').md5(time()).$file_name; //上面3行是为上传文件重命名。加入md5随机串码是避免重名。
      $upload_path = $path.'/'.$upload_name;
      move_uploaded_file($_FILES['userfile']['tmp_name'][$k],$upload_path);//上面2行移动文件到指定目录
      //如果需要将上传文件的属性信息写到数据库(大部分情况下需要),这里需要加入数据库的代码。
      //如果需要,需提前定义一个空数组,将插入数据库后生成的记录的自增id,写到数组中。如upload_id[]=$this->db->insert_id();
    }
}
}
至此,多文件上传的部分就已经完成,后续需要编辑你的业务逻辑代码。是不是很简单?

页: [1]
查看完整版本: 多文件上传的解决方法