Laravel5.7 使用 AliyunOSS 上传

对象存储 (Object Storage Service, 简称 OSS) OSS 相信大家都听过,它是阿里云对外提供的海量,安全和高可靠的云存储服务。大家可以把自己网站的资源存上面加快自己网站速度,阿里云 官网也有文档不过对于新手来说有点难,那么这里我给大家推荐一个组件和组件的使用.

这里使用到的前端上传组件 layui 上传 aliyun 组件使用的是 johnlui/AliyunOSS

安装

composer require johnlui/aliyun-oss:~2.0

构建 Service 文件

新建 app/services/OSS.php 内容可参考: OSS.php,只需要修改下面的信息,变成自己的阿里云 AccessKeyIdAccessKeySecret 即可

<?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]];
    }
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值