一、需求
傳2個參數:uid 用戶ID,photo圖片,然後保存到項目相對路徑:public/file/use/天/下,存(相對路徑+唯一文件名)到數據表。
二、實現方式
1、工具:postman
2、框架:TP
就這一句用到了TP的方法,改成你框架的(對應方法/常量)即可
$thinkPath = Env::get('root_path'); //框架應用根目錄,命名空間爲:use think\facade\Env;
三、postman使用
1、上傳單個圖片,請求接口,這裏打印的是 $_FILE[‘photo’]的信息。注意:這裏的photo是沒有中括號[]的。
打印的result結果爲:
array (
'file_name' => '眼前一亮.jpg',
'unique_name' => 'pic_5ebe4a48047512.30197208.jpg',
'save_path' => 'public/file/use/2020-05-15/pic_5ebe4a48047512.30197208.jpg',
'uid' => '999',
)
2、上傳多個圖片,請求接口,這裏打印的是 $_FILE[‘photo’]的信息。注意:這裏的photo是有中括號[]的。
打印的result結果爲:
array (
0 =>
array (
'file_name' => '眼前一亮.jpg',
'unique_name' => 'pic_5ebe4a5aeb0454.04678583.jpg',
'save_path' => 'public/file/use/2020-05-15/pic_5ebe4a5aeb0454.04678583.jpg',
'uid' => '999',
),
1 =>
array (
'file_name' => '眼前一亮.jpg',
'unique_name' => 'pic_5ebe4a5aeb8135.16792457.jpg',
'save_path' => 'public/file/use/2020-05-15/pic_5ebe4a5aeb8135.16792457.jpg',
'uid' => '999',
),
)
四、實現代碼
<?php
namespace app\index\controller;
use think\facade\Env;
class Ablog extends Base{
/**
* 請求方式 POST
* @return 返回Json數據
*/
public function test5(){
$uid = empty($_POST['uid']) ? '' : $_POST['uid'];
$data = empty($_FILES['photo']) ? [] : $_FILES['photo']; //文件參數名爲 photo
if (empty($uid)){
return 'param [uid] is required';
}
if (empty($data)){
return 'please upload file';
}
//上傳單個文件
$result = $this->uploadOne($data, $uid);
if ($result){
$result['uid'] = $uid; //拼接上 $uid
// 這裏可以把數據存入數據庫
// $pictureDao = new PictureDao();
// $pictureDao->insert($result);
// var_export($result);
var_export($result);die();
}
/*-----------------------------分割線-----------------------------*/
//上傳多個文件:打開 /**/ 測試
// $result = $this->uploadMore($data, $uid);//傳了$uid
/*$result = $this->uploadMore($data); //沒傳 $uid
if ($result){
//由於沒傳$uid,這裏要循環拼接一下$uid數據
foreach ($result as &$value){ //直接引用賦值
$value['uid'] = $uid;
}
// 這裏可以把數據存入數據庫
// $pictureDao = new PictureDao();
// $pictureDao->insertAll($result);
var_export($result);die();
}*/
return json_encode('success');
}
/**
* 單個文件上傳
* @param $data 文件信息
* @return array 結果數據
*/
public function uploadOne($data){
if ($data['error'] != 0){ //文件上傳異常,直接返回[]
return [];
}
//注意:這裏處理文件名重複的情況,要保證文件名唯一
//這裏先獲取原文件名的後綴,然後自定義唯一文件名
$fileName = $data['name'];
$suffix = substr($fileName, strrpos($fileName, '.')); //從右查找第一次出現.的位置;然後截取。結果爲.jpg
$uniqueName = uniqid('pic_', true) . $suffix;//嘗試生成唯一隨機文件名
$tempFile = $data['tmp_name'];
list($fileName, $uniqueName, $savePath) = $this->saveFile($tempFile, $uniqueName, $fileName);
$result = [
'file_name' => $fileName,
'unique_name' => $uniqueName,
'save_path' => $savePath
];
return $result;
}
/**
* 文件批量上傳(可以不傳uid參數)
* @param $data 文件信息
* @param $uid 用戶ID(根據實際情況這個參數可以不傳)
* @return array
*/
// public function uploadMore($data, $uid){
public function uploadMore($data){ //不傳$uid,使該方法通用
//下面這些參數根據實際情況使用
$names = $data['name'];
$types = $data['type'];
$tmpNames = $data['tmp_name'];
$errors = $data['error'];
$sizes = $data['size'];
$result = [];
$count = count($names);
for ($i = 0; $i < $count; $i++){
$error = $errors[$i];
if ($error != 0){ //文件上傳異常,continue
continue;
}
//注意:這裏處理文件名重複的情況,要保證文件名唯一
//這裏先獲取原文件名的後綴,然後自定義唯一文件名
$fileName = $names[$i];
$suffix = substr($fileName, strrpos($fileName, '.')); //從右查找第一次出現.的位置;然後截取。結果爲.jpg
$uniqueName = uniqid('pic_', true) . $suffix;//嘗試生成唯一隨機文件名
$tempFile = $tmpNames[$i];
list($fileName, $uniqueName, $savePath) = $this->saveFile($tempFile, $uniqueName, $fileName);
$result[] = [
// 'uid' => $uid,
'file_name' => $fileName,
'unique_name' => $uniqueName,
'save_path' => $savePath
];
}
return $result;
}
/**
* 文件保存方法
* @param $tempFile 臨時存放路徑
* @param $uniqueName 唯一名字,存放到目錄中的名字
* @param $fileName 原名字
* @param string $path 文件存放的目錄
* @return array
*/
public function saveFile($tempFile, $uniqueName, $fileName, $path = '/file/use/'){
$thinkPath = Env::get('root_path'); //框架應用根目錄,命名空間爲:use think\facade\Env;
$thinkPath = str_replace('\\', '/', $thinkPath); //把 \\ 替換成 /
$savePath = 'public' . $path . date('Y-m-d') . '/'; //文件存放的相對路徑(相對應用根目錄)
$saveDb = $savePath . $uniqueName;//存放到數據表的路徑
$saveFile = $thinkPath . $saveDb; //文件存放的絕對路徑
$mkdirPath = $thinkPath . $savePath;
if (!is_dir($mkdirPath)){ //文件夾不存在,則創建;並給最大權限 777
mkdir($mkdirPath,0777,true);
chmod($mkdirPath,0777);
}
//法一:先複製,再刪除原文件
// copy($tempFile, $saveFile); //把臨時存放的文件移動到我們需要保存的目錄
// unlink($tempFile); //刪除緩存的文件
//法二:直接移動原文件
move_uploaded_file($tempFile, $saveFile);
return [ $fileName, $uniqueName, $saveDb ];
}
}