在 Laravel 上将图片上传到阿里云 OSS
上次我们学会了怎么将图片上传到七牛云,这次就学一学怎么将图片上传到阿里云OSS
上传之前当然需要去阿里云开通 对象存储OSS (后面就简称OSS),开通的细节我们就不说了。让我们回归主题,怎么将图片上传到OSS上。在这里我们选用了 jacobcyl/ali-oss-storage
扩展包,在项目根目录中运行:
composer require jacobcyl/ali-oss-storage
然后在 config/app.php
文件中注册 Jacobcyl\AliOSS\AliOssServiceProvider
:
'providers' => [
// Other service providers...
Jacobcyl\AliOSS\AliOssServiceProvider::class,
],
然后需要在 config/filesystems.php
文件中的 disks
中添加OSS的配置信息
'disks' => [
'qiniu' => [
'driver' => 'qiniu',
'access_key' => env('QINIU_ACCESS_KEY'),
'secret_key' => env('QINIU_SECRET_KEY'),
'bucket' => env('QINIU_BUCKET'),
'domain' => env('QINIU_DOMAIN'),
],
'oss' => [
'driver' => 'oss',
'access_id' => env('ALIYUN_ACCESS_ID'),
'access_key' => env('ALIYUN_ACCESS_KEY'),
'bucket' => env('ALIYUN_BUCKET'),
'endpoint' => env('ALIYUN_ENDPOINT'),
'cdnDomain' => env('ALIYUN_CDN_DOMAIN'),
'ssl' => env('ALIYUN_SSL'),
'isCName' => env('ALIYUN_IS_CNAME'),
'debug' => env('ALIYUN_DEBUG')
],
然后在 .env
文件中进行配置
ALIYUN_ACCESS_ID= //AccessKeyId
ALIYUN_ACCESS_KEY= //AccessKeySecret
ALIYUN_BUCKET= //OSS bucket名
ALIYUN_ENDPOINT= // OSS 外网节点或自定义外部域名
ALIYUN_CDN_DOMAIN= //如果isCName为true, 获取url时会判断cdnDomain是否设定来决定返回的url,如果cdnDomain未设置,则使用endpoint来生成url,否则使用cdn
ALIYUN_SSL= //<true|false> 是否使用https
ALIYUN_IS_CNAME= //<true|false> 是否使用自定义的域名 对应上面的 ALIYUN_CDN_DOMAIN
ALIYUN_DEBUG= //<true|false>
由于OSS的外网请求流量也是要单独收费的所以我们使用内网来进行访问,内网是免费的。
ALIYUN_ENDPOINT
的格式为:oss-cn-hongkong.aliyuncs.com
要对应自己的OSS地区。可以在OSS的控制台中查看每个bucket的完整配置。因为OSS的图片访问规则为ALIYUN_BUCKET
+ALIYUN_ENDPOINT
所以一定要填对。ALIYUN_CDN_DOMAIN
则是我们自己绑定的域名。一般OSS图片的完整访问路径格式为https://test.oss-cn-hongkong.aliyuncs.com/avatar/8GdIcz1NaCZ.jpeg
很长且不好看,所以我们可以绑定一个自己的域名。最后的格式为https://www.baicu.com/avatar/8GdIcz1NaCZ.jpeg
是不是就熟悉多啦。
接下来我们就可以进行使用啦。由于我们不止一处地方用到上传图片,我们可以把上传图片写入到 自定义的辅助函数文件 中。
<?php
use Illuminate\Support\Facades\Storage;
/**
* 上传图片到阿里云
*
* @param $path 要保存的路径
* @param $file 上传的文件
* @param $drive 要使用的驱动
* @return url 图片完全路径
*/
function upload_image($path, $file, $drive = 'oss')
{
$disk = Storage::disk($drive);
//将图片上传到OSS中,并返回图片路径信息 值如:avatar/WsH9mBklpAQUBQB4mL.jpeg
$path = $disk->put($path, $file);
//由于图片不在本地,所以我们应该获取图片的完整路径,
//值如:https://test.oss-cn-hongkong.aliyuncs.com/avatar/8GdIcz1NaCZ.jpeg
return $disk->url($path);
}
我们的文件路径不存在时是会自动创建的,所以不需要我们手动创建
如果使用自己的域名并且报以下错误:
Arguments
1. ": RequestId: 5DB526470C5171C2446FC735"
我们需要在 OSS控制台中将自己要使用的域名与OSS进行绑定。
绑定了之后可能会需要等待几分钟的时候才会生效,所以不要着急。如果成功,则返回结果为:
https://www.baidu.com/avatar/201910/27/1/ysf3RP9siklpAQUBQB4mL.jpeg
这时我们可以去OSS文件管理里面就可以看到我们刚刚上传的图片啦。
到此我们就成功啦!需要上传的时候只需要这样调用就行啦!
$path = 'avatar/' . date("Ym/d", time());
$image_path = upload_image($path, $request->avatar);
我们可以整合 上一篇 文章,上传到七牛云也合并进来,只需要修改 app/helpers.php
文件
<?php
use Illuminate\Support\Facades\Storage;
/**
* 上传图片到七牛云
*
* @param $path 要保存的路径
* @param $file 上传的文件
* @return url 图片完全路径
*/
function upload_image($path, $file, $drive = 'oss')
{
if (!$path) return false;
$disk = Storage::disk($drive);
$path = $disk->put($path, $file);
switch ($drive) {
case 'qiniu':
return $disk->getUrl($path);
case 'oss':
return $disk->url($path);
}
}
我们可以这样调用
//上传到七牛云
$path = 'avatar/' . date("Ym/d", time());
$image_path = upload_image($path, $request->avatar,'qiniu');
//上传到OSS
$path = 'avatar/' . date("Ym/d", time());
$image_path = upload_image($path, $request->avatar);
大功告成!当然里面还有很多细节问题,需要自己去处理啦。
推荐文章: