zoukankan      html  css  js  c++  java
  • ThinkPHP3上传文件中遇到的问题

    在用ThinkPHP3上传图片的开发过程中遇到如下几个问题:

    1. 上传根目录不存在!请尝试手动创建:./Uploads/;
    2. 上传的图片,中文名称乱码;
    3. 上传文件时会自动生成一个以当前日期命名的文件夹,并将文件保存在其中。

    备注:开发环境为Windows下的Xampp

    附上问题未解决前的代码:

    public function addPic() {
        $uid = I("post.uid", "", "htmlspecialchars");
        
        $upload = new ThinkUpload();                         // 实例化上传类
        $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

    找到ThinkPHPLibraryThinkUploadDriverLocal.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 检测文件是否存在回调,如果存在返回文件信息数组
  • 相关阅读:
    【数据结构】优先队列和堆
    【ACM非算法部分】读入优化
    【解题报告】[动态规划]RQNOJ
    【解题报告】[动态规划]RQNOJ
    【解题报告】[动态规划]-PID69 / 过河卒
    【解题报告】[动态规划]
    【解题报告】[动态规划]RQNOJ PID2 / 开心的金明
    扫描线矩形周长的并 POJ1177
    fft模板 HDU 1402
    离线树状数组 hihocoder 1391 Countries
  • 原文地址:https://www.cnblogs.com/sunshineliulu/p/6610272.html
Copyright © 2011-2022 走看看