TechSolution

Programing tutorial

Simpan File kedalam Cloud dengan Object Storage Services(OBS) pada Huawei Cloud

bos huawei cloudbos huawei cloud

Object Storage Services (OBS) adalah layanan penyimpanan awan yang disediakan oleh Huawei Cloud. Dengan OBS, Anda dapat menyimpan berbagai jenis data, termasuk file, gambar, video, dan banyak lagi. Disini kita akan membahas cara menyimpan file di awan menggunakan Huawei Cloud OBS.

Pastikan kita sudah berlangganan Huwei Cloud OBS. Berikut langkah untuk integrasi OBS pada framework Laravel

1. Menggunakan Package flysystem-aws-s3-v3

Disini kita menggunakan package flysystem-aws-s3-v3. Jalankan perintah berikut:

  composer require league/flysystem-aws-s3-v3

Setelah menginstal paket, Kita perlu mengkonfigurasi paket tersebut. Buka file config/filesystems.php dan tambahkan disk baru untuk S3:

  'disks'=>[
     's3' => [
         'driver' => 's3',
         'key' => env('OBS_ACCESS_KEY_ID'),
         'secret' => env('OBS_SECRET_ACCESS_KEY'),
         'region' => env('OBS_DEFAULT_REGION'),
         'bucket' => env('OBS_BUCKET'),
         'url' => env('OBS_URL'),
         'endpoint' => env('OBS_ENDPOINT'),
         'use_path_style_endpoint' => env('OBS_USE_PATH_STYLE_ENDPOINT', false),
     ],
  ]

Kemudian,Kita tambahkan variabel yang sesuai ke file .env:

  OBS_ACCESS_KEY_ID=your_access_key_id
  OBS_SECRET_ACCESS_KEY=your_secret_access_key
  OBS_DEFAULT_REGION=your_region
  OBS_BUCKET=your_bucket_name
  OBS_URL=your_url
  OBS_ENDPOINT=your_endpoint
  OBS_USE_PATH_STYLE_ENDPOINT=false

Sekarang Kita dapat menggunakan fakade Storage untuk berinteraksi dengan penyimpanan OBS pada aplikasi kita. Misalnya, untuk mengunggah file:

use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Storage;

class UsersController extends Controller
{
 
function operationObs(){
     $file = $request->file('attachment');    // 'jhon_doe.jpg'

     // upload file text with contents text
     Storage::disk('s3')->put('file.txt', 'Lorem ipsum dolor sit amet');

     //upload files to object storage
     Storage::disk('s3')->put('my-folder/my-photos/'.$filename, file_get_contents($file));


     // get file with base64
     $getfile = $this->getFileBase64($file);

     // delete file object
     Storage::disk('s3')->delete('file.txt');

     // make directory
      Storage::disk('s3')->makeDirectory('Mydirectory');

     // delete directory
      Storage::disk('s3')->deleteDirectory('Mydirectory');
}

    public function getFileBase64($file){
        $getfile = Storage::disk('s3')->get($file);
        $mimeType = Storage::disk('s3')->mimeType($file);
        $base64 = base64_encode($getfile);
        $mimeToExtension = [
            'image/jpeg' => 'jpg',
            'image/png' => 'png',
            'application/pdf' => 'pdf',
            // Add more mappings as needed
         ];
         $extension = $mimeToExtension[$mimeType] ?? 'unknown';
         return json_encode(['base64'=>'data:'.$mimeType.';base64,'.$base64,'type'=>$extension]);
    }

    function uploadFile($fileName,$base64) {
        $fileData = base64_decode($base64);
        $fileName = date('_tracking_Y-m-d H:i:s').'.png'; 
        $save= Storage::disk('s3')->put('pli/'.$fileName, $fileData);
        if($save){
            return json_encode(['status'=>'success']);
        }else{
            return json_encode(['status'=>'false']);
        }
    }
}

2. Menggunakan File Object langsung

Download Paket OBS dibawah ini:

Ekstrak file OBS dan tempatkan pada folder app

Pada file .env tambahkan variable berikut untuk config OBS:

HUAWEI_OBS_KEY=YourKEY
HUAWEI_OBS_SECRET=Your Secret
HUAWEI_OBS_BUCKET=Your Bucket
HUAWEI_OBS_ENDPOINT=Your Endpoint OBS

Buka file config/filesystems.php dan tambahkan variable berikut pada disks:

        'obs' => [
            'driver' => 'obs',
            'key' => env('HUAWEI_OBS_KEY'),
            'secret' => env('HUAWEI_OBS_SECRET'),
            'bucket' => env('HUAWEI_OBS_BUCKET'),
            'region' => env('HUAWEI_OBS_REGION'),
            'endpoint' => env('HUAWEI_OBS_ENDPOINT'),
            'throw' => false,
        ],

Kita membuat sebuah file services dengan nama ObsService pada path app/Services/ObsService.php

<?php
namespace App\Services;
use App\Helpers\Query;
use App\Obs\Obs\ObsClient;
use Att\Responisme\Exceptions\StarterKitException;
use Exception;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\Storage;

class ObsService
{
   // For Configuration OBS connect 
    private static function createObsClient()
    {
        $obsClient = new ObsClient([
            'key' => config('filesystems.disks.obs.key'),
            'secret' => config('filesystems.disks.obs.secret'),
            'endpoint' => config('filesystems.disks.obs.endpoint'),
        ]);
        return $obsClient;
    }
    // get File OBS
    public static function getObjectUrl($objectname)
    {
        $obsClient = self::createObsClient();
        $resp = $obsClient->createSignedUrl([
            'Method' => 'GET',
            'Bucket' => config('filesystems.disks.obs.bucket'),
            'Key' => $objectname,
            'SaveAsStream' => true
        ]);
        return $resp['SignedUrl'];
    }
    // Upload file to OBS
    public static function toStorage($prefix, $file, $pathimage, $reqExtensions = null, $isObs = false)
    {
        $fileName   = $prefix . '_' . time() . '_' . str_replace([' '], '', $file->getClientOriginalName());
        if ($reqExtensions) {
            $isrightExt = false;
            foreach ($reqExtensions as $ext) {
                if ($ext == $file->getClientOriginalExtension()) {
                    $isrightExt = true;
                    break;
                }
            }
            if (!$isrightExt) {
                throw new Exception("File Mush Be [" . join(", ", $reqExtensions) . "] Format");
            }
        }
        if (!$isObs) {
            Storage::disk('public')->put($pathimage . $fileName, File::get($file));
            return 'storage/' . $pathimage . $fileName;
        } else {
            $obsClient = self::createObsClient();
            $obsClient->putObject([
                'Bucket' => config('filesystems.disks.obs.bucket'),
                'Key' =>  $pathimage . $fileName,
                'Body' =>  file_get_contents($file->path()) //fopen($file->getPath(), 'r'), //$file->getPathName()
            ]);
            return $pathimage . $fileName;
        }
    }
    // get realpath of object
    public static function getRealPath($path){
       // $input = "folderName/image/myImage.png";
        $output = preg_replace("/^storage\//", "", $path);
        return $output;
    }
   
   // clone file object
    public static function cloneFileObs($fileName, $oldfilename, $pathimage)
    {
        $obsClient = self::createObsClient();
        $obsClient->copyObject([
            'Bucket' => config('filesystems.disks.obs.bucket'),
            'Key' =>  $pathimage . $fileName,
            'CopySource' => config('filesystems.disks.obs.bucket').'/'.$oldfilename
        ]);
        return $pathimage . $fileName;
    }

   // check is exist object
    public static function isFileExist($name, $message)
    {
        if (!$file = request()->file($name)) {
            throw new Exception($message);
        }
        return $file;
    }
  // if. file exists
    public static function ifFileExist($name)
    {
        $ret = true;
        if (!$file = request()->file($name)) {
            return false;
        }
        return $ret;
    }
   // remove object Folder
    public static function removeObsFile($fileName)
    {
        $obsClient = self::createObsClient();
        $obsClient->deleteObject([
            'Bucket' => config('myFolderName'),
            'Key' => $fileName,
            'SaveAsStream' => false
        ]);
    }
  // remove file
    public static function removeFile($fileName)
    {
        $imageloc = str_replace('folderName', '', $fileName);
        Storage::delete('/subFolder' . $imageloc);
    }
}

Class ObsService yang telah kita buat siap digunakan didalam aplikasi kita seperti contoh berikut:

use App\Services\ObsService;
class UsersController extends Controller
{
   public function getImage($id)
    {
        $imageData= ObsService::getObjectUrl('user/brandon.png');
        echo $imageData;
    }
}

Sekian kita menggunakan OBS pada Laravel, Kita bisa menggunakan OBS untuk mengolah file kita secara independen alih-alih kita menyimpan nya didalam project kita.

Happy Coding!

By raflesngln@gmail.com

Stay Hungry Stay Foolish

Leave a Reply

Your email address will not be published. Required fields are marked *