在 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进行绑定。

在 Laravel 上将图片上传到阿里云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);

大功告成!当然里面还有很多细节问题,需要自己去处理啦。

勤于编程,善于思考
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 8

不应该使用web直传吗? 如果传的是视频文件,还需要服务器中转再传给阿里云就很傻了

1年前 评论
无谓 (楼主) 1年前

可以的,最近这几天也是在做oss上传图片,基于laravel-admin后台弄的,可能方式略有不同,等后续我也贴出来,大家一起讨论一下!

1年前 评论

自定义域名已配置,cdn 也开启了,依旧是报错

file

file

file

1年前 评论

@gyp719 解决了吗?我的突然也报这个错误

1年前 评论

使用自有域名,配置了cdn就报这类错误

Arguments

  1. ": RequestId: 5DB526470C5171C2446FC735"
9个月前 评论

@Noctis 请问你解决了吗?

9个月前 评论
Noctis 8个月前

$image_path = upload_image($path, $request->avata); 中的 $request->avatar 获取不到文件呢,是不是还需要引那个文件。

4个月前 评论

我的上传文件报错 message: "Class 'Symfony\Component\Filesystem\Exception\FileNotFoundException' not found" 我代码是这么写的 file 报错没找到原因

file

4个月前 评论
无谓 (楼主) 4个月前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!