对象存储 (Object Storage Service, 简称 OSS) OSS 相信大家都听过,它是阿里云对外提供的海量,安全和高可靠的云存储服务。大家可以把自己网站的资源存上面加快自己网站速度,阿里云 官网也有文档不过对于新手来说有点难,那么这里我给大家推荐一个组件和组件的使用.
这里使用到的前端上传组件 layui
上传 aliyun 组件使用的是 johnlui/AliyunOSS
composer require johnlui/aliyun-oss:~2.0
新建 app/services/OSS.php
内容可参考: OSS.php
,只需要修改下面的信息,变成自己的阿里云 AccessKeyId
AccessKeySecret
即可
<?php
namespace App\Services;
use JohnLui\AliyunOSS;
use Exception;
use DateTime;
class OSS {
/* 城市名称:
*
* 经典网络下可选:杭州、上海、青岛、北京、张家口、深圳、香港、硅谷、弗吉尼亚、新加坡、悉尼、日本、法兰克福、迪拜
* VPC 网络下可选:杭州、上海、青岛、北京、张家口、深圳、硅谷、弗吉尼亚、新加坡、悉尼、日本、法兰克福、迪拜
*/
private $city = '北京';
// 经典网络 or VPC
private $networkType = '经典网络';
private $AccessKeyId;
private $AccessKeySecret;
private $ossClient;
/**
* 私有初始化 API,非 API,不用关注
* @param boolean 是否使用内网
*/
public function __construct($isInternal = false)
{
if ($this->networkType == 'VPC' && !$isInternal) {
throw new Exception("VPC 网络下不提供外网上传、下载等功能");
}
$this->ossClient = AliyunOSS::boot(
$this->city,
$this->networkType,
$isInternal,
$this->AccessKeyId = env('AccessKeyId'),
$this->AccessKeySecret =env('AccessKeySecret')
);
}
/**
* 使用外网上传文件
* @param string bucket名称
* @param string 上传之后的 OSS object 名称
* @param string 删除文件路径
* @return boolean 上传是否成功
*/
public static function publicUpload($bucketName, $ossKey, $filePath, $options = [])
{
$oss = new OSS();
$oss->ossClient->setBucket($bucketName);
return $oss->ossClient->uploadFile($ossKey, $filePath, $options);
}
/**
* 使用阿里云内网上传文件
* @param string bucket名称
* @param string 上传之后的 OSS object 名称
* @param string 删除文件路径
* @return boolean 上传是否成功
*/
public static function privateUpload($bucketName, $ossKey, $filePath, $options = [])
{
$oss = new OSS(true);
$oss->ossClient->setBucket($bucketName);
return $oss->ossClient->uploadFile($ossKey, $filePath, $options);
}
/**
* 使用外网直接上传变量内容
* @param string bucket名称
* @param string 上传之后的 OSS object 名称
* @param string 删除传的变量
* @return boolean 上传是否成功
*/
public static function publicUploadContent($bucketName, $ossKey, $content, $options = [])
{
$oss = new OSS();
$oss->ossClient->setBucket($bucketName);
return $oss->ossClient->uploadContent($ossKey, $content, $options);
}
/**
* 使用阿里云内网直接上传变量内容
* @param string bucket名称
* @param string 上传之后的 OSS object 名称
* @param string 删除传的变量
* @return boolean 上传是否成功
*/
public static function privateUploadContent($bucketName, $ossKey, $content, $options = [])
{
$oss = new OSS(true);
$oss->ossClient->setBucket($bucketName);
return $oss->ossClient->uploadContent($ossKey, $content, $options);
}
/**
* 使用外网删除文件
* @param string bucket名称
* @param string 目标 OSS object 名称
* @return boolean 删除是否成功
*/
public static function publicDeleteObject($bucketName, $ossKey)
{
$oss = new OSS();
$oss->ossClient->setBucket($bucketName);
return $oss->ossClient->deleteObject($bucketName, $ossKey);
}
/**
* 使用阿里云内网删除文件
* @param string bucket名称
* @param string 目标 OSS object 名称
* @return boolean 删除是否成功
*/
public static function privateDeleteObject($bucketName, $ossKey)
{
$oss = new OSS(true);
$oss->ossClient->setBucket($bucketName);
return $oss->ossClient->deleteObject($bucketName, $ossKey);
}
/**
* -------------------------------------------------
*
*
* 下面不再分公网内网出 API,也不注释了,大家自行体会吧。。。
*
*
* -------------------------------------------------
*/
public function copyObject($sourceBuckt, $sourceKey, $destBucket, $destKey)
{
$oss = new OSS();
return $oss->ossClient->copyObject($sourceBuckt, $sourceKey, $destBucket, $destKey);
}
public function moveObject($sourceBuckt, $sourceKey, $destBucket, $destKey)
{
$oss = new OSS();
return $oss->ossClient->moveObject($sourceBuckt, $sourceKey, $destBucket, $destKey);
}
// 获取公开文件的 URL
public static function getPublicObjectURL($bucketName, $ossKey)
{
$oss = new OSS();
$oss->ossClient->setBucket($bucketName);
return $oss->ossClient->getPublicUrl($ossKey);
}
// 获取私有文件的URL,并设定过期时间,如 \DateTime('+1 day')
public static function getPrivateObjectURLWithExpireTime($bucketName, $ossKey, DateTime $expire_time)
{
$oss = new OSS();
$oss->ossClient->setBucket($bucketName);
return $oss->ossClient->getUrl($ossKey, $expire_time);
}
public static function createBucket($bucketName)
{
$oss = new OSS();
return $oss->ossClient->createBucket($bucketName);
}
public static function getAllObjectKey($bucketName)
{
$oss = new OSS();
return $oss->ossClient->getAllObjectKey($bucketName);
}
public static function getObjectMeta($bucketName, $ossKey)
{
$oss = new OSS();
return $oss->ossClient->getObjectMeta($bucketName, $ossKey);
}
}
第二种方法, 推荐:
"jacobcyl/ali-oss-storage": "^2.1"
配置 filesystems:
'oss' => [
'driver' => 'oss',
'access_id' => env('OSS_ACCESS_KEY_ID'),//Your Aliyun OSS AccessKeyId
'access_key' => env('OSS_ACCESS_KEY_SECRET'),//Your Aliyun OSS AccessKeySecret
'bucket' => env('OSS_BUCKET_NAME'),//OSS bucket name
'endpoint' => env('OSS_ENDPOINT'), //<the endpoint of OSS, E.g: oss-cn-hangzhou.aliyuncs.com | custom domain, E.g:img.abc.com> OSS 外网节点或自定义外部域名
//'endpoint_internal' => '', //<internal endpoint [OSS内网节点] 如:oss-cn-shenzhen-internal.aliyuncs.com> v2.0.4 新增配置属性,如果为空,则默认使用 endpoint 配置(由于内网上传有点小问题未解决,请大家暂时不要使用内网节点上传,正在与阿里技术沟通中)
//'cdnDomain' => '', //<CDN domain, cdn域名> 如果isCName为true, getUrl会判断cdnDomain是否设定来决定返回的url,如果cdnDomain未设置,则使用endpoint来生成url,否则使用cdn
'ssl' => true, // true to use 'https://' and false to use 'http://'. default is false,
'isCName' => false, // 是否使用自定义域名,true: 则Storage.url()会使用自定义的cdn或域名生成文件url, false: 则使用外部节点生成url
'debug' => false,
],
配置 easysms:
// 阿里云
'aliyun' => [
'access_key_id' => env('SMS_ACCESS_KEY_ID'),
'access_key_secret' => env('SMS_ACCESS_KEY_SECRET'),
'sign_name' => env('SMS_SIGN_NAME'),
],
],
在 composer.json
中 autoload -> classmap
处增加配置:
"autoload": {
"classmap": [
"app/services"
]
}
然后运行 composer dump-autoload。
创建控制器类 Util/UploadController
控制器用于接收前台上传的图片,上传到阿里云 OSS, 并且拿到返回路径,需要注意的是下面代码中 publicUpload
getPublicObjectURL
方法后面第一个参数要换成阿里云 OSS Bucket
名称即可.
/**
* Created by PhpStorm.
* User: fanzhichao
* Date: 2019/11/22
* Time: 15:27
*/
namespace App\Http\Controllers\Applets;
use App\Http\Controllers\Controller;
use App\Models\User;
use App\Services\OSS;
use Illuminate\Http\Request;
class UserInfoController extends Controller
{
public function user_info_update(Request $request)
{
//获取上传的头像
$file = $request->file('file');
//获取用户Id
$Id = $request->get('id');
//获取昵称
$nickname = $request->get('nickname');
//获取姓名
$realname = $request->get('realname');
//获取手机号
$phone = $request->get('phone');
//获取生日
$birthday = $request->get('birthday');
//获取性别
$sex = $request->get('sex');
//获取上传图片的临时地址
$tmppath = $file->getRealPath();
//生成文件名
$fileName = str_random(5) . $file->getFilename() . time() .date('ymd') . '.' . $file->getClientOriginalExtension();
//拼接上传的文件夹路径(按照日期格式1810/17/xxxx.jpg)
$pathName = 'avatar/'.$fileName;
//上传图片到阿里云OSS
OSS::publicUpload('yuets365', $pathName, $tmppath, ['ContentType' => $file->getClientMimeType()]);
//获取上传图片的Url链接
$Url = OSS::getPublicObjectURL('yuets365', $pathName);
// 返回状态给前端,Laravel框架会将数组转成JSON格式
$data['avatar'] = $Url;
$data['nickname'] = $nickname;
$data['realname'] = $realname;
$data['phone'] = $phone;
$data['birthday'] = $birthday;
$data['sex'] = $sex;
//更新数据
User::where('id',$Id)->update([
'avatar'=>$Url,
'nickname'=>$nickname,
'realname'=>$realname,
'phone'=>$phone,
'birthday'=>$birthday,
'sex'=>$sex
]);
return ['code' => 200, 'msg' => '上传成功', 'data' => ['src' => $Url]];
}
}