PHP实现多张图片上传

PHP实现多张图片上传

       最近在做一个项目模块的时候,需要用到多张图片上传,博主使用的是原生PHP,所以将多张图片上传

的代码跟大家分享一下。首先我们先写前端代码:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, 
  minimum-scale=1.0, user-scalable=no">
  <meta content="yes" name="apple-mobile-web-app-capable">
  <meta http-equiv="Access-Control-Allow-Origin" content="*">
  <title>上传</title>
  <style type="text/css">
   body {
      font-size: 18px;
   }
  </style>
</head>
<body>
   <form action="uploadImage.php" method="POST" target="_blank" enctype="multipart/form-data">
        <label>选择文件:</label>
        <input type="file" id="files" name="files[]" multiple />
        <button type="submit" class="btn btn-primary">提交</button>
    </form>
</form>
</body>
</html>

       然后是后端PHP代码,负责接收前端传过来的图片并保存在本地,代码如下:

#获取用户上传的文件
$files = getFile();
#判断是否上传了文件
if (count($files) <= 0) {
    echo "请上传文件";
    exit();
}
#判断是否上传超过9张
if (count($files) > 9) {
    echo "图片上传最大数为9张";
    exit();
}
#初始化保存地址数组
$returnList = array();
#循环遍历文件
foreach ($files as $fileInfo) {
    #上传文件
    $res = uploadFile($fileInfo);
    #判断是否上传成功
    if ($res["code"] != 200) {
        //删除本地文件【防止占用空间】
        deleteImage($returnList);
        //返回
        echo $res["msg"];
        exit();
    }
    #添加进待上传至数组
    $returnList[] = $res["msg"];
}
#返回
return $returnList;

////////////////////  操作本地图片方法  ///////////////////

/**
 * 获取用户上传的图片元素
 * @return array
 */
function getFile()
{
    $i = 0;
    $files = array();
    foreach ($_FILES as $file) {
        if (is_string($file['name'])) {
            $files['$i'] = $file;
            $i++;
        } elseif (is_array($file['name'])) {
            foreach ($file['name'] as $k => $v) {
                $files[$i]['name'] = $file['name'][$k];
                $files[$i]['type'] = $file['type'][$k];
                $files[$i]['tmp_name'] = $file['tmp_name'][$k];
                $files[$i]['error'] = $file['error'][$k];
                $files[$i]['size'] = $file['size'][$k];
                $i++;
            }
        }
    }
    return $files;
}


/**
 * 文件上传至本地
 * @param $file
 * @param string $path
 * @param int $max_size
 * @param array $allowExt
 * @return array
 */
function uploadFile($file,$path='uploads',$max_size=3000000,$allowExt=['jpeg', 'jpg', 'png'])
{
    #获取图片基础参数
    $filename = $file['name'];
    $type = $file['type'];
    $temp_name = $file['tmp_name'];
    $error = $file['error'];
    $size = $file['size'];
    #判断
    if ($error == UPLOAD_ERR_OK) {
        //判断大小是否超过
        if ($size > $max_size) {
            return array(
                'code' => 404,
                'msg' => $filename . "文件超过规定上传大小"
            );
        }
        //判断是否是上传图片
        $ext = getExt($filename);
        if (!in_array($ext, $allowExt)) {
            return array(
                'code' => 404,
                'msg' => $filename . '文件名不合乎规范'
            );
        }
        //判断传输方式
        if (!is_uploaded_file($temp_name)) {
            return array(
                'code' => 404,
                'msg' => $filename . "文件不是通过HTTP POST 方法上传上传过来的"
            );
        }
        //判断暂时存放地方是否有权限
        if (!file_exists($path)) {
            mkdir($path, 0777, true);
            chmod($path, 0777);
        }
        //重新命名图片名字
        $fileName = getUniName();
        $destination = $path . '/' . $fileName . '.' . $ext;
        if (move_uploaded_file($temp_name, $destination)) {
            return array(
                'code' => 200,
                'msg' => $destination
            );
        } else {
            return array(
                'code' => 404,
                'msg' => $filename . "文件上传失败"
            );
        }
    } else {
        switch ($error) {
            case '1':
                return array(
                    'code' => 404,
                    'msg' => "超过了配置文件上传文件的大小"
                );
                break;
            case '2':
                return array(
                    'code' => 404,
                    'msg' => "超过表单设置上传文件文件的大小"
                );
                break;
            case '3':
                return array(
                    'code' => 404,
                    'msg' => "文件部分被上传"
                );
                break;
            case '4':
                return array(
                    'code' => 404,
                    'msg' => "没有文件被上传"
                );
                break;
            case '6':
                return array(
                    'code' => 404,
                    'msg' => "没有找到临时目录"
                );
                break;
            case '7':
                return array(
                    'code' => 404,
                    'msg' => "文件不可写"
                );
                break;
            default:
                return array(
                    'code' => 404,
                    'msg' => "上传文件失败"
                );
                break;
        }
    }
}

/**
 * 获得文件扩展名
 * @param  string $filename 上传文件名
 * @return string           返回扩展名
 */
function getExt($filename)
{
    $arr = explode('.', basename($filename));
    return end($arr);
}

/**
 * 获得文件唯一扩展名
 * @return string 经过md5后生成32位唯一的上传文件名
 */
function getUniName()
{
    return md5(uniqid(microtime(true), true));
}


/**
 * 删除本地图片【发生错误或者上传不上去】
 * @param $imageList
 */
function deleteImage($imageList)
{
    if (count($imageList) > 0) {
        foreach ($imageList as $key => $value) {
            if (file_exists($value)) {
                unlink($value);
            }
        }
    }
}

       这样我们就成功实现多张图片上传并防止中途出现意外,图片存留问他。

0条评论

发表评论