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;
结果是这样的:
果然是没经过优化的代码。。。
代码中关键的一步
$actualName = md5(time().substr(str_replace(" ", '_', $ext),5)).".".$ext;
通过 time() + ext 得到路径,那么有没有考虑过
在同一秒内,相同后缀的不同图片上传
,会是一样的路径看你数据库的结果,就印证了,这一点
怎么解决呢
1、精确到 毫秒 or 微妙,也是有概率出现重复
2、路径生成增加条件 rand 随机数,也是有概率出现重复
3、
uniqid
嗯,1+2+3 结合起来吧,重复概率太低了,除非你是 bat 了,到那个量级在说吧