ThinkPHP3上传文件中遇到的问题
在用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 | 检测文件是否存在回调,如果存在返回文件信息数组 |
ThinkPHP3上传文件中遇到的问题的更多相关文章
- SpringMVC上传压缩文件,解压文件,并检测上传文件中是否有index.html
SpringMVC上传压缩文件,解压文件,并检测上传文件中是否有index.html 说明: 1.环境:SpringMVC+Spring+Tomcat7+JDK1.7 2.支持 zip和rar格式的压 ...
- 使用input file上传文件中onChange事件只触发一次问题
每次上传文件的时候,都会将当前的文件路径保存至$event.target.value中,当第二次选择文件时,由于两次$event.target.value相同,所以不会触发change事件. 解决方案 ...
- MVC 上传文件并展示
最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精 最近在做自学MVC,遇到的问题很多,索性一点点总结 ...
- 【Bootstrap】bootstrap-fileinput上传文件插件
[bootstrap-fileinput] 这是个据传最好用的bootstrap相关联的文件上传控件,支持拖曳上传,多线程上传,上传文件预览等等功能. 首先还是说一下要引入的一些文件: <lin ...
- 上传文件multipart form-data boundary 说明
含义 ENCTYPE="multipart/form-data" 说明: 通过 http 协议上传文件 rfc1867协议概述,客户端发送内容构造. 概述 ...
- Angular2使用ng2-file-upload上传文件
Angular2中有两个比较好用的上传文件的第三方库,一个是ng2-file-upload,一个是ng2-uploader.ng2-uploader是一个轻便的上传文件的支持库,功能较弱,而ng2-f ...
- http 协议上传文件multipart form-data boundary 说明--转载
原文地址:http://xixinfei.iteye.com/blog/2002017 含义 ENCTYPE="multipart/form-data" 说明: 通过 http 协 ...
- 编写Java程序,实现客户端向服务端上传文件的功能
查看本章节 查看作业目录 需求说明: 实现客户端向服务端上传文件的功能 当启动服务端后,运行客户端程序,系统提示客户在客户端输入上传文件的完整路径.当客户在客户端输入完成后,服务端实现文件上传 实现思 ...
- Spring中servletFileUpload完成上传文件以及文本的处理
JSP: <%@ page language="java" contentType="text/html; charset=UTF-8" pageEnco ...
随机推荐
- HDU 5919 Sequence II(主席树+区间不同数个数+区间第k小)
http://acm.split.hdu.edu.cn/showproblem.php?pid=5919 题意:给出一串序列,每次给出区间,求出该区间内不同数的个数k和第一个数出现的位置(将这些位置组 ...
- C++类的大小——sizeof(class)
第一:空类的大小 class CBase { }; 运行cout<<"sizeof(CBase)="<<sizeof(CBase)<<endl; ...
- Spring3.x 版本和 JDK1.8 不兼容导致 java.lang.IllegalStateException: Failed to load ApplicationContext
由于安装了 JDK1.8 的版本,最近在进行整合 Struts2+Spring+Hibernate 框架的时候,不小心导入了之前下载的 Spring 3.2.0 版本的 jar 包. 结果在运行测试用 ...
- /usr/bin/perl:bad interpreter:No such file or directory 的解决办法
yum -y install gcc gcc-c++ perl make kernel-headers kernel-devel 可能会提示:Cannot find a valid baseurl f ...
- spring mvc 形参类型
spring mvc 形参类型 1 没有占位符号的,形参的名字为参数的名称 请求路径为:organtrans/t1/t5?a=1(a为形参的的名称必须一致) @RequestMapping(" ...
- SpringBoot和Mybatis的整合
这里介绍两种整合SpringBoot和Mybatis的模式,分别是“全注解版” 和 “注解xml合并版”. 前期准备开发环境 开发工具:IDEAJDK:1.8技术:SpringBoot.Maven.M ...
- Qt532界面.ZC测试
ZC:Delphi中只要随便拖几个控件,设置一下属性就OK了.但是,Qt中 貌似没有 方便的方式来做这个... ZC:目前的解决方案是:Qt中 拖几个控件,然后点 工具条里面的 "栅格布局( ...
- 学大数据是先学java还是先学python?
大数据的发展趋势日渐明显,但是进入这个领域的门槛不小,除了要有心理准备,其次就是要付诸实际行动中去学习. 学习方法有很多,在没有基础的前提下,自学是因人而异是有难度.其次是大数据目前的工作方向主要是三 ...
- 学习笔记39—笑谈FireFox标签不同步(IOS和Wiindows)
为了解决国内用户连接 全球同步服务器 困难的问题,火狐中国版推出了 全球服务 和 本地服务 两套服务. 这两套服务的账号和数据并不通用,并且只有中国版提供了切换功能,因此当你在同步过程中遇到“未知账号 ...
- CentOS7 上安装 Lua5.3
1.CentOS7默认已经安装了5.1.4 ①查看当前lua版本号:lua -v Lua 5.1.4 Copyright (C) 1994-2008 Lua.org, PUC-Rio ②查看lua和 ...