php - 行動端上傳多張圖片,後台只處理了一張
伊谢尔伦
伊谢尔伦 2017-05-24 11:30:54
0
1
469

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;

結果是這樣的:

#
伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

全部回覆(1)
过去多啦不再A梦

果然是沒經過優化的程式碼。 。 。

程式碼中關鍵的一步
$actualName = md5(time().substr(str_replace(" ", '_', $ext),5)).".".$ext;

透過 time() + ext 得到路徑,那麼有沒有考慮過在同一秒内,相同后缀的不同图片上传,會是一樣的路徑

看你資料庫的結果,就印證了,這一點

要怎麼解
1、精確到 ​​毫秒 or 微妙,也是有機率出現重複
2、路徑產生增加條件 rand 隨機數,也是有機率出現重複
3、uniqid

嗯,1+2+3 結合起來吧,重複機率太低了,除非你是 bat 了,到那個量級在說吧

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板