php - Téléchargez plusieurs images sur le terminal mobile, mais une seule est traitée en arrière-plan
伊谢尔伦
伊谢尔伦 2017-05-24 11:30:54
0
1
489

1. Récemment, PHP est utilisé pour se connecter au côté IOS, lors du téléchargement de plusieurs images, le côté APP appelle l'interface de téléchargement d'image unique en arrière-plan en boucle, et l'arrière-plan enregistre l'image et stocke le chemin dans la base de données. Cependant, le résultat final est que, autant d'images sont téléchargées qu'il y a d'images identiques dans la base de données, cela signifie que l'interface ne peut traiter qu'une seule image.
Le code backend est le suivant (pas encore optimisé)
//Formater le tableau $_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;

Le résultat est le suivant :

伊谢尔伦
伊谢尔伦

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

répondre à tous(1)
过去多啦不再A梦

Il s'agit en effet d'un code non optimisé. . .

L'étape clé du code
$actualName = md5(time().substr(str_replace(" ", '_', $ext),5)).".".$ext; $actualName = md5(time().substr(str_replace(" ", '_', $ext),5)).".".$ext;

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

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

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

Obtenez le chemin via time() + ext, alors avez-vous pensé que si différentes images avec le même suffixe sont téléchargées dans la même seconde, elles auront le même chemin

En regardant les résultats de votre base de données, cela est confirmé🎜 🎜Comment le résoudre🎜1. Précis à la milliseconde ou à la microseconde, il y a une probabilité de duplication🎜2 Ajoutez un nombre aléatoire conditionnel à la génération de chemin, il y a aussi une probabilité de duplication🎜3. 🎜 🎜Eh bien, combinons 1+2+3, la probabilité de répétition est trop faible, à moins que vous ne soyez une chauve-souris, parlons-en à ce niveau-là🎜
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal