ThinkPHP3上传文件中遇到的问题

旧街凉风 提交于 2020-04-01 06:35:34

在用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 检测文件是否存在回调,如果存在返回文件信息数组
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!