laravel使用阿里雲OSS上傳圖片


需要自己注冊阿里雲賬號並且開通oss服務,建立Bucket存儲空間,此步驟不做演示

一、composer安裝:使用composer在項目根目錄執行以下命令  

composer require johnlui/aliyun-oss:~2.0

 二、構建 Service 文件 需要自己手動建立 app/services/OSS.php

修改配置信息,改為自己的阿里雲AccessKeyId AccessKeySecret

注意OSS.php 文件中 private $city = ‘青島’; 所對應的城市,要根據自己OSS相對應的地區所選擇

如何查看自己的OSS地區,請到阿里雲OSS中查看,修改錯誤會導致無法連接到阿里雲OSS服務器

OSS.php文件:

<?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.json 中 autoload -> classmap 處增加配置 

 

在終端根目錄下進行composer操作:

composer dump-autoload

 

四、控制器的使用方法

創建控制器類 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啦

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM