Laravel5.2 集成阿里云--OSS对象存储服务

来源:互联网 发布:模糊查询sql语句 编辑:程序博客网 时间:2024/05/16 04:37

一、前提准备

1、申请阿里云账户(忽略);
2、开通 oss 对象存储功能(收费);
3、创建 bucket (空间名称);
4、在Access Key管理,创建一个秘钥,获取 AccessKey / SecretKey;

二、集成PHP-SDK

(一)Composer 安装 SDK(推荐使用)

进入cmd 终端,切换目录到你部署项目的根目录下,执行以下命令即可:composer require “johnlui/aliyun-oss”

(二)传统方式安装

进入阿里云,下载官方 PHP-SDK,将下载下来的SDK解压,放入项目第三库文件(vendor)

三、实战开发

1、.env 配置文件

ALIOSS_SERVER=oss-cn-shenzhen.aliyuncs.comALIOSS_SERVERINTERNAL=oss-cn-shenzhen-internal.aliyuncs.comALIOSS_KEYID=abcabcabcabcALIOSS_KEYSECRET=abcabcabcabcabcabcabcabcALIOSS_BUCKETNAME=xiaoxiaozhouALIOSS_CITYNAEM=深圳ALIOSS_NETWORKTYPE=经典网络

2、ali_oss 配置参数文件 alioss.php :该文件放在 config 目录下

<?php/** * ali_oss 配置参数 */return [    'ossServer' => env('ALIOSS_SERVER', null),                   // 外网    'ossServerInternal' => env('ALIOSS_SERVERINTERNAL', null),   // 内网    'AccessKeyId' => env('ALIOSS_KEYID', null),                  // key    'AccessKeySecret' => env('ALIOSS_KEYSECRET', null),          // secret    'BucketName' => env('ALIOSS_BUCKETNAME', null),              // bucket 空间名字    'cityName' => env('ALIOSS_CITYNAEM', null),                  //城市名    'networkType' => env('ALIOSS_NETWORKTYPE', null),            //网络类型];

3、封装类 OSS.php :该文件放在 App\Service 目录下

<?phpnamespace App\Service;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) {        $this->city = config('alioss.cityName');        $this->networkType = config('alioss.networkType');        $this->AccessKeyId = config('alioss.AccessKeyId');        $this->AccessKeySecret = config('alioss.AccessKeySecret');        if($this->networkType == 'VPC' && !$isInternal) {            throw new Exception("VPC 网络下不提供外网上传、下载等功能");        }        $this->ossClient = AliyunOSS::boot(            $this->city,            $this->networkType,            $isInternal,            $this->AccessKeyId,            $this->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     * @param $bucketName     * @param $ossKey     * @return string     */    public static function getPublicObjectURL($bucketName, $ossKey) {        $oss = new OSS();        $oss->ossClient->setBucket($bucketName);        return $oss->ossClient->getPublicUrl($ossKey);    }    /**     * 获取私有文件的URL,并设定过期时间,如 \DateTime('+1 day')     * @param $bucketName     * @param $ossKey     * @param DateTime $expire_time     * @return mixed     */    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);    }}

4、上传文件控制器类 UploadController.php

<?phpnamespace App\Http\Controllers\Home;use App\Http\Controllers\Controller;use App\Service\OSS;use Illuminate\Http\Request;class UploadController extends Controller {    /**     * 上传页面展示     */    public function upload_page() {        return view('upload');    }    /**     * 客户端请求应用服务器 ,服务器并且响应     */    public function har_request(Request $request) {        /** 接收表单提交的文件信息 */        $file = $request->file('file');        /** 判断提交文件是否有效 */        if($file->getError() != 0) {            echo "提交文件失败!";exit;        }        /** 获取上传文件相关信息 */        $originalName = $file->getClientOriginalName();     // 文件原名        $realPath = $file->getRealPath();    //临时文件的绝对路径        $filename = date('Y-m-d').'-'.uniqid().'-'.$originalName;    //新的文件名        /** 对象存储云上名字 */        $bucketName = config('alioss.BucketName');        $uploadResult = OSS::publicUpload($bucketName,$filename,$realPath);    //调用 OSS 上传方法        /** 判断文件是否上传成功 */        if($uploadResult) {            echo "上传文件成功!";        }else {            echo "上传文件失败!";        }    }}

四、总结分析

1、该文章主要目的是为了实现功能,代码并没有优化;
2、OSS.php 类是直接复制的php-sdk 里的示例代码,稍微改动配置了下;
3、有时间再优化下代码;
4、最后,小伙伴们可以自行封装代码,更深入的了解该OSS服务。

原创粉丝点击