在用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 检测文件是否存在回调,如果存在返回文件信息数组

ThinkPHP3上传文件中遇到的问题的更多相关文章

  1. SpringMVC上传压缩文件,解压文件,并检测上传文件中是否有index.html

    SpringMVC上传压缩文件,解压文件,并检测上传文件中是否有index.html 说明: 1.环境:SpringMVC+Spring+Tomcat7+JDK1.7 2.支持 zip和rar格式的压 ...

  2. 使用input file上传文件中onChange事件只触发一次问题

    每次上传文件的时候,都会将当前的文件路径保存至$event.target.value中,当第二次选择文件时,由于两次$event.target.value相同,所以不会触发change事件. 解决方案 ...

  3. MVC 上传文件并展示

    最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精    最近在做自学MVC,遇到的问题很多,索性一点点总结 ...

  4. 【Bootstrap】bootstrap-fileinput上传文件插件

    [bootstrap-fileinput] 这是个据传最好用的bootstrap相关联的文件上传控件,支持拖曳上传,多线程上传,上传文件预览等等功能. 首先还是说一下要引入的一些文件: <lin ...

  5. 上传文件multipart form-data boundary 说明

    含义 ENCTYPE="multipart/form-data" 说明: 通过 http 协议上传文件 rfc1867协议概述,客户端发送内容构造. 概述              ...

  6. Angular2使用ng2-file-upload上传文件

    Angular2中有两个比较好用的上传文件的第三方库,一个是ng2-file-upload,一个是ng2-uploader.ng2-uploader是一个轻便的上传文件的支持库,功能较弱,而ng2-f ...

  7. http 协议上传文件multipart form-data boundary 说明--转载

    原文地址:http://xixinfei.iteye.com/blog/2002017 含义 ENCTYPE="multipart/form-data" 说明: 通过 http 协 ...

  8. 编写Java程序,实现客户端向服务端上传文件的功能

    查看本章节 查看作业目录 需求说明: 实现客户端向服务端上传文件的功能 当启动服务端后,运行客户端程序,系统提示客户在客户端输入上传文件的完整路径.当客户在客户端输入完成后,服务端实现文件上传 实现思 ...

  9. Spring中servletFileUpload完成上传文件以及文本的处理

    JSP: <%@ page language="java" contentType="text/html; charset=UTF-8" pageEnco ...

随机推荐

  1. Latex citation using natbib and footnotesize

    References: Natbib bibliography styles How to change font size for bibliography? Latex citation usin ...

  2. Python: find the smallest and largest value

    题目要求: Write a program that repeatedly prompts a user for integer numbers until the user enters 'done ...

  3. C#深入多线程

    主线程: th = Thread.CurrentThread; //现在的线程为主线程 th.Name = "MainThread"; //set线程名字:主线程本身没有名字 th ...

  4. _pvp_killed_loot

    该表控制玩家被击杀时掉落物品,包括角色身上装备,背包物品,银行物品 comment 备注 entry 掉落的物品ID lootCount 掉落的物品数量 chance 掉落的几率,例如50,则50%几 ...

  5. python 部分函数

    abs(number) ,返回数字的绝对值cmath.sqrt(number) ,返回平方根,也可以应用于负数float(object) ,把字符串和数字转换为浮点数help() ,提供交互式帮助in ...

  6. [原][粒子特效][spark]发射器emitter

    深入浅出spark粒子特效连接:https://www.cnblogs.com/lyggqm/p/9956344.html group添加emitter的方式: eimtter: 上图是spark源码 ...

  7. [osg]osg窗口显示和单屏幕显示

    osg::ref_ptr<osg::Node> loadedModel = osgDB::readNodeFile("cow.osg"); osg::ref_ptr&l ...

  8. 《剑指offer》第五十六题(数组中唯一只出现一次的数字)

    // 面试题56(二):数组中唯一只出现一次的数字 // 题目:在一个数组中除了一个数字只出现一次之外,其他数字都出现了三次.请 // 找出那个吃出现一次的数字. #include <iostr ...

  9. sort-归并排序

    void sort_merge(vector<int> &v,int left,int right) { if(left>=right) return; int mid=(l ...

  10. 使用Qss设置QT程序界面的样式和皮肤

    1         使用Qss设置QT程序界面的样式和皮肤 1.1  Qss的功能 Qt程序界面中控件的背景图片.大小.字体颜色.字体类型.按钮状态变化等属性可以通过Qss文件来设置,美化UI界面.实 ...