ThinkPHP3上傳文件中遇到的問題


在用ThinkPHP3上傳圖片的開發過程中遇到如下幾個問題:

  1. 上傳根目錄不存在!請嘗試手動創建:./Uploads/;
  2. 上傳的圖片,中文名稱亂碼;
  3. 上傳文件時會自動生成一個以當前日期命名的文件夾,並將文件保存在其中。

備注:開發環境為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 檢測文件是否存在回調,如果存在返回文件信息數組


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM