1、上传到本地
上传文件
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方法成功的话返回的是一个\think\File对象,你可以对上传后的文件进行后续操作。
## 多文件上传
如果你使用的是多文件上传表单,例如:
<form class="form form-horizontal" method="post" action="{:url('admin/article/addArticle')}" enctype="multipart/form-data">
<div class="row cl">
<label class="form-label col-xs-4 col-sm-2">图集:</label>
<div class="formControls col-xs-8 col-sm-9">
<input id="file-0" type="file" multiple class="file" name="path[]" >
</div>
</div>
<div class="row cl">
<div class="col-xs-8 col-sm-9 col-xs-offset-4 col-sm-offset-2">
<input class="btn btn-primary radius" type="submit" value=" 提交 ">
</div>
</div>
</form>
控制器代码可以改成:
public function addArticle()
{
//判断提交的方式
if(\request()->isPost()){
//多图上传
$arryFile =\request()->file("path");
$arrImg=[];
foreach ($arryFile as $File){
$pathImg="";
//移动文件到框架应用更目录的public/uploads/
$info = $File->move(ROOT_PATH . 'public' . DS . 'upload' . DS . 'article' . DS . date('Y') . DS . date('m-d'),md5(microtime(true)));
if ($info) {
$pathImg = "/public/upload/article/" . date('Y') . '/' . date('m-d') . '/' . $info->getFilename();
} else {
//错误提示用户
return $this->error($File->getError());
}// $result["img_url"]
$arrImg[]= $pathImg;
}
$insert_data["img_url"]=implode(",",$arrImg);
Db::name("articles")->insert($insert_data);
}
return $this->fetch("article-add");
}
上传验证
支持对上传文件的验证,包括文件大小、文件类型和后缀:
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();
}
}
2、上传到七牛云
1-安装七牛云官方SDK
composer require qiniu/php-sdk -vvv
2-七牛云配置
1----config文件
//七牛云配置
'qiniu' => [
'accessKey' => '.......................................',
'secretKey' => '.......................................',
'domain' => '.............................',//域名地址
'bucket' => '......',//空间名称
'zone'=> 'south_china'//区域
],
3- 对应的控制器
use Qiniu\Auth;require 'vendor/qiniu/php-sdk/autoload.php'; //引入自动加载类use Qiniu\Storage\UploadManager; //实例化上传类
public function add(){
$file = request()->file('img');
// 要上传图片的本地路径
$filePath = $file->getRealPath();
$ext = pathinfo($file->getInfo('name'), PATHINFO_EXTENSION); //后缀
// 上传到七牛后保存的文件名
$key =substr(md5($file->getRealPath()) , 0, 5). date('YmdHis') . rand(0, 9999) . '.' . $ext;
// 需要填写你的 Access Key 和 Secret Key
// 构建鉴权对象
$accessKey =config("qiniu")["accessKey"];
$secretKey =config("qiniu")["secretKey"];
$auth=new Auth($accessKey,$secretKey);
// 要上传的空间
$bucket =config("qiniu")["bucket"];
//域名
$domain=config("qiniu")["domain"];
$token = $auth->uploadToken($bucket);
// 初始化 UploadManager 对象并进行文件的上传
$uploadMgr = new UploadManager();
// 调用 UploadManager 的 putFile 方法进行文件的上传
list($ret, $err) = $uploadMgr->putFile($token, $key, $filePath);
if ($err !== null) {
return ["err"=>1,"msg"=>$err,"data"=>""];
} else {
//返回图片的完整URL
$imgPath=$domain.'/'.$key;
//赋值
$data["thumb_url"] = $imgPath;
$data = Db::name('top_bar')->insert($data);
$this->redirect("/admin/topbar/index");
}
}
3、上传到阿里云OSS
1.下载一个阿里云oss的sdk 也可以到阿里云 的OSS存储里面去下载
composer require aliyuncs/oss-sdk-php
2-去官方找些配置,在application同级目录的config目录里面新建一个alioss.php的文件,讲配置信息放进去像下面这样
<?php
// +----------------------------------------------------------------------// | 阿里云OSS配置// +----------------------------------------------------------------------return [
'KeyId' => '', //Access Key ID
'KeySecret' => '', //Access Key Secret
'Endpoint' => '', //阿里云oss 外网地址endpoint
'Bucket' => '', //Bucket名称];
3-控制器
public function uploadFile()
{
$file = request()->file('file'); //获取到上传的文件
print_r($this->uploadFileVideo($file));
}
public function ossUploadFile($file)
{
if ('' == $file) return '参数为空';
$resResult = Image::open($file);
// 尝试执行
try {
$config = Config::pull('alioss'); //获取Oss的配置
//实例化对象 将配置传入
$ossClient = new OssClient($config['KeyId'], $config['KeySecret'], $config['Endpoint']);
//这里是有sha1加密 生成文件名 之后连接上后缀
$fileName = 'img/' . sha1(date('YmdHis', time()) . uniqid()) . '.' . $resResult->type();
//执行阿里云上传
$result = $ossClient->uploadFile($config['Bucket'], $fileName, $file->getInfo()['tmp_name']);
/**
* 这个只是为了展示
* 可以删除或者保留下做后面的操作
*/
$arr = [
//图片地址
'imgurl' => $result['info']['url'],
//数据库保存名称
'dbimgName' => $fileName ];
} catch (OssException $e) {
return $e->getMessage();
}
//将结果输出
return $arr;
}
4、上传到阿里云OSS2
config 配置文件
'local_upload_path'=>ROOT_PATH . 'public' . DS . 'uploads',
'oss'=>[
'accessKeyId' => "XXXXXXXXXXXXXXXX",
'accessKeySecret' => "XXXXXXXXXXXXXXXX",
// Endpoint以杭州为例,其它Region请按实际情况填写。
'endpoint' => "XXXXXXXXXXXXXXXX",
// 存储空间名称
'bucket'=> "XXXXXXXXXXXXXXXX",
// 文件名称
'object' => "XXXXXXXXXXXXXXXX"
],
上传图片到本地
public function upload(){
// 获取表单上传文件 例如上传了001.jpg
$file = request()->file('myfile');
// 移动到框架应用根目录/public/uploads/ 目录下
if($file){
$info = $file->move(config('local_upload_path'));
if($info){
// 成功上传后 获取上传信息
$target = config('local_upload_path').DS.$info->getSaveName();
//上传到oss
$res = $this->oss_upload($target, $info->getFilename());
exit(json_encode($res));
}else{
// 上传失败获取错误信息
//echo $file->getError();
exit(json_encode(array('code'=>2,'mes'=>$file->getError())));
}
}
}
/**
* 上传图片到阿里云oss
* @param $target 文件路径
* @param $filename 上传oss时文件名
* @return mixed
*/
public function oss_upload($target,$filename){
import('aliyun.autoload');
$accessKeyId = config('oss.accessKeyId');
$accessKeySecret = config('oss.accessKeySecret');
// Endpoint以杭州为例,其它Region请按实际情况填写。
$endpoint = config('oss.endpoint');
// 存储空间名称
$bucket= config('oss.bucket');
// 文件名称
$object = config('oss.object');
$ossClient = new \OSS\OssClient($accessKeyId, $accessKeySecret, $endpoint);
try {
$res = $ossClient->doesBucketExist($bucket);
} catch (\OSS\Core\OssException $e) {
$result['mes'] = $e->getMessage();
$result['code'] = 3;
return $result;
}
if ($res === true) {
try {
$object = $object.'/'.$filename;
$info = $ossClient->uploadFile($bucket, $object, $target);
$result['message'] = '上传成功';
$result['code'] = 0;
$result['pic'] = $info['info']['url'];
return $result;
} catch (\OSS\Core\OssException $e) {
$result['mes'] = $e->getMessage();
$result['code'] = 4;
return $result;
}
} else {
$result['message'] = '服务端存储空间不存在';
$result['code'] = 1;
return $result;
}
}