laravel使用阿里云OSS上传图片

须要本身注册阿里云帐号而且开通oss服务,创建Bucket存储空间,此步骤不作演示php

1、composer安装:使用composer在项目根目录执行如下命令  前端

composer require johnlui/aliyun-oss:~2.0

 2、构建 Service 文件 须要本身手动创建 app/services/OSS.phpjson

修改配置信息,改成本身的阿里云AccessKeyId AccessKeySecret数组

注意OSS.php 文件中 private $city = ‘青岛’; 所对应的城市,要根据本身OSS相对应的地区所选择服务器

如何查看本身的OSS地区,请到阿里云OSS中查看,修改错误会致使没法链接到阿里云OSS服务器

网络

OSS.php文件:app

<?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,
            $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
    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);
    }
}

注意命名空间,若是是按照上述目录则不需修改命名空间,不然修改成与你对应的命名空间composer

3、在 composer.json 中 autoload -> classmap 处增长配置 框架

 

在终端根目录下进行composer操做:测试

composer dump-autoload

 

4、控制器的使用方法

建立控制器类 Api/UploadController 控制器用于接收前台上传的图片,上传到阿里云OSS,而且拿到返回路径。Bucket名称名称换成本身的

namespace App\Http\Controllers\Api;
 
use App\Http\Controllers\Controller;
use App\Services\OSS;
use Illuminate\Http\Request;
 
class UploadController extends Controller
{
    public function upload(Request $request)
    {
    //获取上传的文件
    $file = $request->file('file');
    //获取上传图片的临时地址
    $tmppath = $file->getRealPath();
    //生成文件名
    $fileName = rand(1000,9999) . $file->getFilename() . time() .date('ymd') . '.' . $file->getClientOriginalExtension();
    //拼接上传的文件夹路径(按照日期格式1810/17/xxxx.jpg)
    $pathName = date('Y-m/d').'/'.$fileName;
    //上传图片到阿里云OSS
    OSS::publicUpload('Bucket名称', $pathName, $tmppath, ['ContentType' => $file->getClientMimeType()]);
    //获取上传图片的Url连接
    $Url = OSS::getPublicObjectURL('Bucket名称', $pathName);
    // 返回状态给前端,Laravel框架会将数组转成JSON格式
    return ['code' => 0, 'msg' => '上传成功', 'data' => ['src' => $Url]];
}
}

写路由测试:

 

而后返回信息和图片的URL:

 

 

 而后就OK啦

相关文章
相关标签/搜索