在用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 | 检测文件是否存在回调,如果存在返回文件信息数组 |
来源:https://www.cnblogs.com/sunshineliulu/p/6610272.html