您现在的位置是: 网站首页>文章详情 文章详情

TP5上传图片(本地上传、七牛云、OSS)

Heartless Wolf 1560129298 thinkphp 14155 收藏

简介 ThinkPHP是一个免费开源的,快速、简单的面向对象的轻量级PHP开发框架,是为了敏捷WEB应用开发和简化企业应用开发而诞生的。ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简的代码的同时,也注重易用性。遵循Apache2开源许可协议发布,意味着你可以免费使用ThinkPHP,甚至允许把你基于ThinkPHP开发的应用开源或商业产品发布/销售。

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="&nbsp;&nbsp;提交&nbsp;&nbsp;">
			</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;
   }

}


文章评论

    点击加载更多评论

我的名片

网名:Hello World

职业:PHP开发

现居:福建省-福州市

Email:565554856@qq.com

  • 图片信息

站点信息

  • 建站时间:2019-04-20
  • 文章总计:69条
  • 笔记总计:4条
  • 文章评论:0条
  • 笔记评论:0条
  • 当前访问IP:3.144.127.94