在用ThinkPHP3上傳圖片的開發過程中遇到如下幾個問題:
- 上傳根目錄不存在!請嘗試手動創建:./Uploads/;
- 上傳的圖片,中文名稱亂碼;
- 上傳文件時會自動生成一個以當前日期命名的文件夾,並將文件保存在其中。
備注:開發環境為Windows下的Xampp
附上問題未解決前的代碼:
public function addPic() {
$uid = I("post.uid", "", "htmlspecialchars");
$upload = new \Think\Upload(); // 實例化上傳類
$upload->maxSize = 3145728 ; // 設置附件上傳大小
$upload->exts = array('jpg', 'gif', 'png', 'jpeg');// 設置附件上傳類型
$upload->rootPath = "./Uploads/$uid/"; // 設置附件上傳根目錄
$Upload->saveName = "台標"; // 設置附件上傳文件名
// 上傳文件
$info = $upload->upload();
if (!$info) {
echo json_encode(array(
'status' => -1,
'msg' => $upload->getError() // 上傳失敗時提示的錯誤信息
));
} else {
# code... // 上傳成功時的處理代碼,略
)
}
以下為三個問題的解決方法:
問題1
查資料時有網友說這是文件夾權限問題,可按如下方法解決:
比如想把上傳的圖片保存到./Uploads目錄里,就把rootPath設置成 './',savePath改成要保存的路徑,注意前面不要帶“./”。這樣最終的保存目錄路徑為./Uploads/1/。
$upload->rootPath = "./";
$upload->savePath = "Uploads/$uid/";
問題2
找到ThinkPHP\Library\Think\Upload\Driver\Local.class.php文件中的save方法:
/**
* 保存指定文件
* @param array $file 保存的文件信息
* @param boolean $replace 同名文件是否覆蓋
* @return boolean 保存狀態,true-成功,false-失敗
*/
public function save($file, $replace=true) {
$filename = $this->rootPath . $file['savepath'] . $file['savename'];
/* 不覆蓋同名文件 */
if (!$replace && is_file($filename)) {
$this->error = '存在同名文件' . $file['savename'];
return false;
}
/* 移動文件 */
if (!move_uploaded_file($file['tmp_name'], $filename)) {
$this->error = '文件上傳保存錯誤!';
return false;
}
return true;
}
將
if (!move_uploaded_file($file['tmp_name'], $filename))
改為
if (!move_uploaded_file($file['tmp_name'], iconv('utf-8','gb2312',$filename)))
問題3
上傳時,默認自動使用子目錄保存上傳文件,即$upload->autoSub = true;將其設為false即可。
在代碼中的上傳參數中添加如下代碼:
$upload->autoSub = false;
附:上傳參數
| 屬性 | 描述 |
|---|---|
| maxSize | 文件上傳的最大文件大小(以字節為單位),0為不限大小 |
| rootPath | 文件上傳保存的根路徑 |
| savePath | 文件上傳的保存路徑(相對於根路徑) |
| saveName | 上傳文件的保存名稱 |
| saveExt | 上傳文件的保存后綴,不設置的話使用原文件后綴 |
| replace | 存在同名文件是否是覆蓋,默認為false |
| exts | 允許上傳的文件后綴(留空為不限制),使用數組或者逗號分隔的字符串設置,默認為空 |
| mimes | 允許上傳的文件類型(留空為不限制),使用數組或者逗號分隔的字符串設置,默認為空 |
| autoSub | 自動使用子目錄保存上傳文件 默認為true |
| subName | 子目錄創建方式,采用數組或者字符串方式定義 |
| hash | 是否生成文件的hash編碼 默認為true |
| callback | 檢測文件是否存在回調,如果存在返回文件信息數組 |
