สำหรับ 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 เรียบร้อยแล้ว...

 

ความคิดเห็น

หากบทเรียนรู้มีความผิดพลาดประการใด หรือมีข้อเสนอแนะกรุณาแจ้ง contact@programmerthailand.com