0

1.最近使用PHP与IOS端对接,在做上传多张图片功能的时候,APP端通过循环调用后台的上传单张图片接口,后台将图片保存,将路径存入数据库。可是最终结果是传几张图片,数据库中就存在多少张相同图片,也就是说该接口只能处理一张图片。
后端代码如下(还未做优化)
// 格式化$_FILES数组

     $path = "./upload/post/";

     $valid_formats = array('jpg','png','gif','bmp','jpeg','PNG','JPG','JPEG','GIF','BMP');
     if(!isset($_POST) || !$_SERVER['REQUEST_METHOD'] == 'POST') {
         $mess = [
                 'code' => 0,
                 'message' => '请求数据失败',
                 'result' => ['msg' => '请求参数或者请求方式错误'],
         ];
         echo json_encode($mess);
         exit;
     }
     if($_FILES['ava']['error'] != 0) {
         $mess = [
                 'code' => 0,
                 'message' => '请求数据失败',
                 'result' => ['msg' => '文件上传失败',],
         ];
     }
     $name = $_FILES['ava']['name'];
     $size = $_FILES['ava']['size'];
     if(!strlen($name)) {
         $mess = [
                 'code' => 0,
                 'message' => '请求数据失败',
                 'result' => ['msg' => '文件名不存在'],
         ];
         echo json_encode($mess);
         exit;
     }
     $ext = $this -> getExtension($name);
     if(!in_array($ext,$valid_formats)) {
         $mess = [
                 'code' => 0,
                 'message' => '请求数据失败',
                 'result' => ['msg' => "请上传jpg','png','gif','bmp','jpeg'格式图片(拓展名大写也是可以的)"],
         ];
         echo json_encode($mess);
         exit;
     }
     if($size > (3 * 1024 * 1024)) {
         $mess = [
                 'code' => 0,
                 'message' => '请求数据失败',
                 'result' => ['msg' => '图片大小不应超过3M'],
         ];
         echo json_encode($mess);
         exit;
     }

     $actualName = md5(time().substr(str_replace(" ", '_', $ext),5)).".".$ext;
     $tmp = realpath($_FILES['ava']['tmp_name']);
     if(!is_dir($path)) {
         if(!mkdir($path,0777,true)) {
             $mess = [
                     'code' => 4,
                     'message' => '请求资源失败',
                     'result' => '文件夹创建失败',
             ];
             echo json_encode($mess);
             exit;
         }
     }
     if(!move_uploaded_file($tmp,$path.$actualName)) {
         $mess = [
                 'code' => 0,
                 'message' => '请求数据失败',
                 'result' => ['msg' => '上传文件失败',],
         ];
         echo json_encode($mess);
         exit;
     }
     // 组装图片数据
     $data['url'] = $this -> visitpath.'post/'.$actualName;
     $data['pid'] = $pid;
     $data['atime'] = time();
    $res = model('postgallery') -> insert($data);
    
    if(!$res) {
        $mess = [
                'code' => 0,
                'message' => '请求数据失败',
                'result' => ['msg' => '图片上传失败','data' => $data],
        ];
        echo json_encode($mess);
        exit;
    }
    $data['result']['data']['test'] = $n;
    $mess = [
            'code' => 1,
            'message' => '请求数据成功',
            'result' => ['msg' => '图片成功',],
    ];
    echo json_encode($mess);
    exit;

结果是这样的:

1 个回答

2

已采纳

果然是没经过优化的代码。。。

代码中关键的一步
$actualName = md5(time().substr(str_replace(" ", '_', $ext),5)).".".$ext;

通过 time() + ext 得到路径,那么有没有考虑过在同一秒内,相同后缀的不同图片上传,会是一样的路径

看你数据库的结果,就印证了,这一点

怎么解决呢
1、精确到 毫秒 or 微妙,也是有概率出现重复
2、路径生成增加条件 rand 随机数,也是有概率出现重复
3、uniqid

嗯,1+2+3 结合起来吧,重复概率太低了,除非你是 bat 了,到那个量级在说吧