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-v3Setelah 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=falseSekarang 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 OBSBuka 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!
