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 了,到那個量級在說吧