上传文件
ThinkPHP5.0
对文件上传的支持更加简单。
内置的上传只是上传到本地服务器 上传到远程或第三方平台的话需要自己扩展。
假设表单代码如下:
<form action="/index/index/upload" enctype="multipart/form-data" method="post">
<input type="file" name="image" /> <br>
<input type="submit" value="上传" />
</form>
然后在控制器中添加如下的代码:
public function upload(){
// 获取表单上传文件 例如上传了001.jpg
$file = request()->file('image');
// 移动到框架应用根目录/public/uploads/ 目录下
if($file){
$info = $file->move(ROOT_PATH . 'public' . DS . 'uploads');
if($info){
// 成功上传后 获取上传信息
// 输出 jpg
echo $info->getExtension();
// 输出 20160820/42a79759f284b767dfcb2a0197904287.jpg
echo $info->getSaveName();
// 输出 42a79759f284b767dfcb2a0197904287.jpg
echo $info->getFilename();
}else{
// 上传失败获取错误信息
echo $file->getError();
}
}
}
move
方法成功的话返回的是个thinkFile
对象 你可以对上传后的文件进行后续操作。
多文件上传
如果你使用的是多文件上传表单 例如:
<form action="/index/index/upload" enctype="multipart/form-data" method="post">
<input type="file" name="image[]" /> <br>
<input type="file" name="image[]" /> <br>
<input type="file" name="image[]" /> <br>
<input type="submit" value="上传" />
</form>
控制器代码可以改成:
public function upload(){
// 获取表单上传文件
$files = request()->file('image');
foreach($files as $file){
// 移动到框架应用根目录/public/uploads/ 目录下
$info = $file->move(ROOT_PATH . 'public' . DS . 'uploads');
if($info){
// 成功上传后 获取上传信息
// 输出 jpg
echo $info->getExtension();
// 输出 42a79759f284b767dfcb2a0197904287.jpg
echo $info->getFilename();
}else{
// 上传失败获取错误信息
echo $file->getError();
}
}
}
上传验证
支持对上传文件的验证 包括文件大小、文件类型和后缀:
public function upload(){
// 获取表单上传文件 例如上传了001.jpg
$file = request()->file('image');
// 移动到框架应用根目录/public/uploads/ 目录下
$info = $file->validate(['size'=>15678,'ext'=>'jpg,png,gif'])->move(ROOT_PATH . 'public' . DS . 'uploads');
if($info){
// 成功上传后 获取上传信息
// 输出 jpg
echo $info->getExtension();
// 输出 20160820/42a79759f284b767dfcb2a0197904287.jpg
echo $info->getSaveName();
// 输出 42a79759f284b767dfcb2a0197904287.jpg
echo $info->getFilename();
}else{
// 上传失败获取错误信息
echo $file->getError();
}
}
getSaveName
方法返回的是图片的服务器文件地址 并不能直接用于图片的URL地址 尤其在windows平台上必须做转换才能正常显示图片。
如果上传文件验证不通过 则move
方法返回false。
验证参数 | 说明 |
---|---|
size | 上传文件的最大字节 |
ext | 文件后缀 多个用逗号分割或数组 |
type | 文件MIME类型 多个用逗号分割或数组 |
还有个额外的自动验证规则是 如果上传的文件后缀是图像文件后缀 则会检查该文件是否是个合法的图像文件。
上传规则
默认情况下 会在上传目录下面生成以当前日期为子目录 以微秒时间的md5
编码为文件名的文件 例如上面生成的文件名可能是:
/home/www/upload/20160510/42a79759f284b767dfcb2a0197904287.jpg
可以指定上传文件的命名规则 使用rule
方法即可 例如:
// 获取表单上传文件 例如上传了001.jpg
$file = request()->file('image');
// 移动到服务器的上传目录 并且使用md5规则
$file->rule('md5')->move('/home/www/upload/');
最终生成的文件名类似于:
/home/www/upload/72/ef580909368d824e899f77c7c98388.jpg
系统默认提供了几种上传命名规则 包括:
规则 | 描述 |
---|---|
date | 根据日期和微秒数生成 |
md5 | 对文件使用md5_file散列生成 |
sha1 | 对文件使用sha1_file散列生成 |
其中md5和sha1规则会自动以散列值的前两个字符作为子目录 后面的散列值作为文件名。
如果需要使用自定义命名规则 可以在rule
方法中传入函数或方法 例如:
// 获取表单上传文件 例如上传了001.jpg
$file = request()->file('image');
// 移动到服务器的上传目录 并且使用uniqid规则
$file->rule('uniqid')->move('/home/www/upload/');
生成的文件名类似于:
/home/www/upload/573d3b6d7abe2.jpg
如果你希望保留原文件名称 可以使用:
// 获取表单上传文件 例如上传了001.jpg
$file = request()->file('image');
// 移动到服务器的上传目录 并且使用原文件名
$file->move('/home/www/upload/','');
默认情况下 会覆盖服务器上传目录下的同名文件 如果不希望覆盖 可以使用:
// 获取表单上传文件 例如上传了001.jpg
$file = request()->file('image');
// 移动到服务器的上传目录 并且设置不覆盖
$file->move('/home/www/upload/',true,false);
获取文件hash散列值
可以获取上传文件的哈希散列值 例如:
// 获取表单上传文件
$file = request()->file('image');
// 移动到服务器的上传目录 并且使用原文件名
$upload = $file->move('/home/www/upload/');
// 获取上传文件的hash散列值
echo $upload->md5();
echo $upload->sha1();
v5.0.1
以上版本可以统一使用hash方法获取文件散列值
// 获取表单上传文件
$file = request()->file('image');
// 移动到服务器的上传目录 并且使用原文件名
$upload = $file->move('/home/www/upload/');
// 获取上传文件的hash散列值
echo $upload->hash('sha1');
echo $upload->hash('md5');
返回对象
上传成功后返回的仍然是个File
对象 除了File对象自身的方法外 并且可以使用SplFileObject
的属性和方法 便于进行后续的文件处理。
好运来
Call to a member function move
UPLOAD_ERR_OK 值 0 没有错误发生,文件上传成功
UPLOAD_ERR_INI_SIZE 值 1 上传的文件超过了 php.ini 中 upload_max_filesize选项限制的值
UPLOAD_ERR_FORM_SIZE 值 2;上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值
UPLOAD_ERR_PARTIAL 值 3 文件只有部分被上传
UPLOAD_ERR_NO_FILE 值 4;
没有文件被上传, 值 5 上传文件大小为0
修改php.ini文件中的配置
upload_max_filesize=5M
post_max_size = 8M
好运来
参考地址
php 判断字符串 是否 是中文 含有中文的实现代码
preg_match('/[x{4e00}-x{9fa5}]/u', $str) 1有0没有