สำหรับ Amazon Web Service นั้นมีบริการ S3 Storage ที่ออกข่าวว่ามีค่ายโทรศัพท์ค่ายหนึ่งทำการ public จนมีการคัดลอกสำเนาบัตรประชาชนออกไปได้นั่นแหละครับ คือถ้าไม่ public มันจะไม่สามารถ access จากที่อื่นๆ ได้นั่นเอง
ทีนี้ตัว S3 Storage นั้นมี PHP SDK ให้เราโดยสามารถติดตั้งผ่าน composer ได้โดยใช้คำสั่ง
composer require aws/aws-sdk-php
จากนั้นเข้าไปบริการ S3 เพื่อสร้าง bucket ถังเก็บของ
https://s3.console.aws.amazon.com/s3/home
โดยกดปุ่ม Create Bucket
ในที่นี้ตั้งชื่อว่า pgmtl-test และเอาไว้ที่ Asia Pacific (Tokyo) ดู region=ap-northeast-1 จดตัวนี้ไว้
จากนั้นไปเพิ่ม user ที่จะเข้ามาใช้โดยเราจะใช้ key และ secret key ซึ่งต้องสร้างก่อนให้เข้า url
https://console.aws.amazon.com/iam/home#/users
จากนั้นกดปุ่ม Add user ทำตามขั้นตอน และสร้าง Group ให้เลือก AmazonS3FullAccess เป็น role
สุดท้ายจะได้ user พร้อม key และ secret key (มันซ่อนอยู่)
เอาล่ะฝั่ง AWS เตรียมข้อมูลเรียบร้อย มาฝั่ง Programming บ้าง
สร้าง Model รับค่าฟอร์ม สร้าง Controller และ Action ตามต้องการ ในที่นี้สร้าง TestController และ actionS3Upload() ดังนี้
//Model
<?php
/**
* Created by HanumanIT Co., Ltd.
* User: Manop Kongoon (kongoon@gmail.com)
* Date: 12/7/2561
* Time: 0:26
*/
namespace frontend\models;
class S3Form extends \yii\base\Model
{
public $file;
public function rules()
{
return [
[['file'], 'file']
];
}
}
//Controller
public function actionS3Upload()
{
$bucket_name = 'pgmtl-test';//ชื่อ bucket
$im_key = 'AKIAIBADUNZFLYSRAQ7Q'; //key ที่ได้จากการสร้าง user
$im_secret = 'PETL9e+2O1Bkv4feB08HJKQ1dLQ9+TATd3MCfe11'; //key ที่ได้จากการสร้าง user
$s3_path = '';
$model = new S3Form();
if($model->load(Yii::$app->request->post())){
try {
$s3 = S3Client::factory([
'credentials' => [
'key' => $im_key,
'secret' => $im_secret
],
'version' => 'latest',
'region' => 'ap-northeast-1'//region ที่เลือกตอนแรก
]);
} catch (Exception $e){
echo $e->getMessage();
die();
}
$file = UploadedFile::getInstance($model, 'file');
$key_name = 'test/'.$file->baseName.'.'.$file->extension;
$s3_path = 'https://s3.ap-northeast-1.amazonaws.com/'.$bucket_name.'/'.$key_name;
try{
$s3->putObject([
'Bucket' => $bucket_name,
'Key' =>$key_name,
'SourceFile' => $file->tempName,
'StorageClass' => 'REDUCED_REDUNDANCY'
]);
} catch (S3Exception $e){
die('ERROR'. $e->getMessage());
} catch (Exception $e){
die('ERROR'. $e->getMessage());
}
}//submit
return $this->render('s3-upload', [
'model' => $model,
's3_path' => $s3_path
]);
}
//View
<?php
/**
* Created by HanumanIT Co., Ltd.
* User: Manop Kongoon (kongoon@gmail.com)
* Date: 12/7/2561
* Time: 0:25
*/
/* @var $this \yii\web\View */
use yii\widgets\ActiveForm;
use yii\helpers\Html;
$this->title = 'Upload file to AWS S3';
?>
<div class="container">
<?php $form = ActiveForm::begin()?>
<?=$form->field($model, 'file')->fileInput()?>
<?=Html::submitButton('Upload', ['class' => 'btn btn-success'])?>
<?php ActiveForm::end()?>
</div>
เมื่อทดลอง upload โดยเรียก url test/s3-upload จากนั้นเลือกไฟล์แล้ว upload จะเห็นว่ามีไฟล์ ถูก upload ไปที่ bucket เรียบร้อยแล้ว...
ความคิดเห็น