php – Laden Sie mehrere Bilder auf das mobile Endgerät hoch, aber nur eines wird im Hintergrund verarbeitet
伊谢尔伦
伊谢尔伦 2017-05-24 11:30:54
0
1
487

1. Neuerdings wird PHP verwendet, um eine Verbindung mit der IOS-Seite herzustellen. Beim Hochladen mehrerer Bilder ruft die APP-Seite die Hintergrund-Upload-Schnittstelle für einzelne Bilder auf, und der Hintergrund speichert das Bild und speichert den Pfad in der Datenbank. Das Endergebnis ist jedoch, dass so viele Bilder hochgeladen werden, wie identische Bilder in der Datenbank vorhanden sind, d. h. die Schnittstelle kann nur ein Bild verarbeiten.
Der Backend-Code lautet wie folgt (noch nicht optimiert)
//Formatieren Sie das $_FILES-Array

     $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;

Das Ergebnis sieht so aus:

伊谢尔伦
伊谢尔伦

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

Antworte allen(1)
过去多啦不再A梦

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

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

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

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

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

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

Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage