PHP 实现一种多文件上传的方法

preview
需积分: 0 0 下载量 6 浏览量 更新于2020-08-29 收藏 45KB PDF 举报
在PHP中实现多文件上传是常见的需求,尤其是在处理用户通过表单上传图片或文档的场景。本文将介绍一种基于PHP的多文件上传方法,适用于IE7以上和Chrome等主流浏览器。 在HTML表单中,我们需要添加一个支持多选的`<input type="file">`元素,通过设置`multiple`属性来允许用户选择多个文件: ```html <input type="file" id="image" class="file image hidden" name="image[]" multiple="true"> ``` 这样,用户在选择文件时,可以一次性选取多个文件。当表单提交后,PHP会接收到一个以数组形式组织的`$_FILES`超级全局变量,其中包含了所有上传文件的信息。例如: ```json { "name": ["7656.png", "7718.png"], "type": ["image/png", "image/png"], "tmp_name": ["/tmp/phpDzSovj", "/tmp/phpP8kWmT"], "error": [0, 0], "size": [357, 662] } ``` 在PHP中处理这些上传文件时,我们首先需要检查是否有文件被上传。如果没有文件,我们可以返回一个错误信息: ```php if (!isset($_FILES[$field])) { return new JsonResponse(array('errorCode'=>1, 'message'=>'请上传文件')); } ``` 接下来,由于`$_FILES`中的数据已经是以数组形式存在,我们需要遍历并重新命名这些文件,以确保每个文件在上传时具有唯一的键名: ```php $arrayFile = array(); foreach ($_FILES[$field] as $key => $value) { $i = 0; if (is_array($value)) { foreach ($value as $v) { $i++; $name = $field . '_split_' . $i; $_FILES[$name][$key] = $v; } } } ``` 现在,我们可以处理多文件上传的情况了。将所有可能的文件名存储在一个数组`$arrayFile`中,然后遍历这个数组,对每个文件执行上传操作: ```php if ($i > 0) { for ($j = 1; $j <= $i; $j++) { array_push($arrayFile, $field . '_split_' . $j); } } else { array_push($arrayFile, $field); } foreach ($arrayFile as $file) { if (isset($_FILES[$file]) && $_FILES[$file]['name']) { // 自定义上传方法,例如使用move_uploaded_file()函数将文件移动到指定目录 $data = $this->uploadFile($file, $path, uniqid()); // 处理上传结果并返回 if (isset($data) && !empty($data)) { if (!isset($data['errors'])) { $result = array('errorCode' => 0, 'message' => isset($result) ? $result['message'] . ',' . reset($data) : reset($data)); } else { // 返回错误信息 if (is_array(reset($data))) { $message = reset($data)[0]; } else { $message = reset($data); } $result = array('errorCode' => 1, 'message' => $message); } } else { $result = array('errorCode' => 1, 'message' => '上传失败'); break; } } else { $result = array('errorCode' => 1, 'message' => '未找到上传文件'); } } ``` 在`uploadFile()`方法中,你需要实现具体的文件上传逻辑,例如验证文件类型、大小,以及将文件移动到服务器上的指定位置。这里使用`uniqid()`生成一个唯一的文件名,以避免文件重名问题。 `$result`数组包含了所有文件上传的结果,可以返回给前端进行展示或进一步处理。 总结来说,处理PHP多文件上传的关键在于理解`$_FILES`数组的结构,并通过循环处理每个文件,确保每个文件的上传操作独立进行。通过这样的方式,我们可以优雅地处理多个文件的上传,并能有效地管理上传过程中可能出现的错误。