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 :
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 得到路径,那么有没有考虑过
在同一秒内,相同后缀的不同图片上传
,会是一样的路径看你数据库的结果,就印证了,这一点
怎么解决呢
Obtenez le chemin via time() + ext, alors avez-vous pensé que1、精确到 毫秒 or 微妙,也是有概率出现重复
2、路径生成增加条件 rand 随机数,也是有概率出现重复
3、
uniqid
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