บันทึกการเชื่อมต่อ Google Cloud Storage ด้วย Go Part2(การอัพโหลดรูปภาพด้วย API)

Vorrawut Judasri
3 min readAug 2, 2019

--

Introduction

ในส่วนของ Part2 จะเป็นเรื่องของการสร้าง API ด้วยภาษา Go ในการเรียกเพื่ออัพโหลดไฟล์รูปภาพไปที่ Google Cloud Storage นะครับ โดยการอัพโหลดเป็นแบบ form-data และ key ที่ใช้คุยกันชื่อว่า “images” โดยจะต้องอัพโหลดได้เฉพาะ ไฟล์ “.png” ซึ่งต้องมีขนาดของรูปภาพไม่เกิน 5 mb สำหรับ Framework ที่ใช้งาน คือ Echo

โดยหากใครยังไม่ทราบวิธีในการสร้างถังข้อมูลเพื่อเก็บไฟล์ของเราไว้ที่ Google Cloud Storage หรือสร้าง Credential Key เพื่อใช้ในการเชื่อมต่อนั้น สามารถติดตามได้จาก Link ด้านล่างนะครับ

Implementation

สำหรับการสร้าง APIครั้งนี้จะเป็นการอัพโหลดรูปโปรไฟล์ของ User โดยมีการกำหนด Path API ไว้ว่า “http://xxx.xxx.xxx.xxx:9098/images/profile” และตำแหน่งของไฟล์ที่จะทำการอัพโหลดไปที่ Google Cloud Storage คือ “userId/profile/user_profile.png”

ประกาศ Method: เพื่อใช้ในการอัพโหลด Image

สร้าง method: PUT ที่ด้านในมี Path ตามที่ได้คิดไว้และภายในจะเรียกไปยัง handler ที่เราจะสร้างขึ้นใหม่ที่ชื่อว่า uploadProfileImage

สร้าง Handler ที่ทำหน้าที่ในการจัดการ API

ต่อมาเราจะสร้าง handler ที่ชื่อว่า uploadProfileImage ที่ด้านในจะต้องทำการอัพโหลดไฟล์รูปให้กับเรา โดยจะต้องมีการดึงข้อมูลของไฟล์ที่ได้รับมาจาก API ด้วย c.MultipartForm() และทำการตรวจสอบข้อมูลก่อนว่าได้อัพโหลดรูปด้วย key ที่ชื่อว่า “images” ผ่านมาทาง Form-data มาหรือเปล่า ถ้าไม่ใช้จำเป็นจะต้องส่งค่า Error กลับไปให้ด้วย

การตรวจสอบความถูกต้องของขนาดไฟล์ว่ามีขนาดไม่เกิน 5 MB

ในส่วนนี้จะเป็นการเช็คเงื่อนไขของขนาดไฟล์รูปที่อัพโหลดเข้ามาว่าจะต้องมีขนาดไม่เกิน 5 mb โดยถ้าเกินจะทำการ return สถานะ BadRequest หรือ 400 กลับไปพร้อมกับข้อความและรหัส ErrorCode

การตรวจสอบความถูกต้องของ format file ว่าจะต้องเป็น .png เท่านั้น

และอีกเงื่อนไขหนึ่งคือจะต้องเช็คว่าไฟล์ที่อัพโหลดเข้ามานั้นจะต้องเป็นไฟล์ที่มีนามสกุลลงท้ายด้วย .png เท่านั้น โดยถ้าพบไฟล์ประเภทอื่นจะทำการ return สถานะ BadRequest หรือ 400 กลับไปพร้อมกับข้อความและรหัส ErrorCode

การอ่านค่า Data จากไฟล์ที่เราอัพโหลดเข้ามาผ่าน API

การอ่านค่า Data จากรูปเพื่อใช้ในการอัพโหลด โดยเมื่ออ่านค่าจะได้ src ที่เป็น multipart.File มา และอย่าลืมสั่งปิดด้วย Close()

การประกอบ imagePath เพื่ออ้างถึงตำแหน่งรูป และการเรียกเมธอด uploadImageGCloud

ก่อนหน้าที่เราจะทำการอัพโหลดไฟล์ไปที่ Google Cloud Storage เราจะต้องสร้างตำแหน่งของไฟล์ที่จะต้องใช้ในการอัพโหลดกันก่อน โดยสร้างให้อยู่ในรูปแบบที่ได้คิดไว้ก่อนหน้า “userId/profile/user_profile.png” หลังจากนั้นเราก็จะทำเรียก method uploadImageGCloud เพื่อทำการ อัพโหลดรูปให้เรา

การสร้างเมธอดเพื่อ upload image เข้าไปที่ Google Cloud Storage และประกาศชื่อ bucket ที่จะใช้เก็บรูป

ประกาศเมธอดที่ด้านในมีการเรียก storage.NewClient ด้วย context ที่รันแบบ background เพื่อใช้ในการเชื่อมต่อกับ Google Cloud Storage รวมถึงประกาศตัวแปรที่เก็บชื่อของ bucket ไว้

เรียกเมธอด NewWriter เพื่อ

มาถึงขั้นตอนในการอ้างถึงตำแหน่ง pathImage ที่อยากจะไปวางไว้โดยใช้ path ตามที่เราได้ประกาศไว้และชื่อ bucket ที่ได้ประกาศไว้ โดยจะต้องเรียกเมธอด NewWriter เพื่อใช้ในการเขียนไฟล์

ข้อมูล struct ของ Writer ที่ return มาให้

ตัวแปร wc ที่เรารับค่ามาจากเมธอด newWriter() จะมี Type เป็น Writer ของ Storage ที่เราจำเป็นต้องใช้ในขั้นตอนอัพโหลดไฟล์ไปที่ Google Cloud Storage

ขั้นตอนต่อไปเราจะเรียก io.copy เพื่อสั่งให้ทำการเขียนไฟล์ที่อัพโหลดเข้ามาไปเก็บในตำแหน่ง pathImage ที่เราตั้งไว้ โดย param ตัวแรกจะเป็นตัว Writer ที่เราได้รับมาก่อนหน้าและ param ตัวที่สองคือไฟล์ที่เราได้รับมาจาก API โดยถ้าเอาอัพโหลดผิดพลาดก็จะส่ง error กลับไปที่คนเรียก API

อย่าลืมการปิดการเชื่อมต่อหลังใช้งานเสร็จ

โดยเมื่อเราใช้งานเสร็จเรียบร้อยแล้วก็อย่าลืมที่จะปิดการเชื่อมต่อ หลังจากที่ทำงานทุกอย่างเสร็จแล้วและไม่มี error เกิดขึ้น เราก็ตอบกลับด้วยสถานะ 200 กลับไปที่ฝั่งคนเรียกใช้ API เพื่อบอกว่าทุกอย่างทำงานเสร็จสมบูรณ์เรียบร้อยแล้วนะครับ

ทำการ return 200 คืนกลับไปเมื่อทำงานเสร็จแล้ว

Proof it’s work

ทดลองอัพโหลดไฟล์ผ่าน API ด้วย Postman กันดูโดยตั้งค่า Body เป็น form-data แล้วใส่ KEY เป็น “images” และทำการเลือกไฟล์ที่จะอัพโหลดใส่ลงไปด้วย หลังจากนั้นก็กดยิง API เลยครับ

ทดลองเรียก API ตามที่กำหนดไว้ด้วย Postman

หลังจากที่รอ response จาก API จนได้รับสถานะ 200 OK เพื่อยืนยันว่ารูปที่เราได้พึ่งอัพโหลดไปสำเร็จแล้วจริงๆ

ได้รับสถานะ 200 OK

เข้าไปเช็คสถานะการอัพโหลดไฟล์ว่าไฟล์รูปภาพได้ถูกไปวางที่ตำแหน่งที่เราได้ตั้งค่าไว้หรือไม่ และมีรูปหรือเวลาอัพโหลดที่ใกล้เคียงกันหรือเปล่า

ตำแหน่งและไฟล์รูปที่อัพโหลดเข้าไป

เราสามารถกดเข้าไปดูรูปที่เราอัพโหลดเข้าไปได้ด้วยการกดที่ชื่อรูป และก็จะเจอกับรุปที่เราพึ่งอัพโหลดเข้าไปด้วย API

ไฟล์รูปที่เราพึ่งอัพเข้าไปด้วย API

Summary

สำหรับ Part2 ที่เป็นขั้นตอนในการอัพโหลดไฟล์ image เข้าไปที่ Google Cloud Storage ก็จบเรียบร้อยแล้วนะครับ หวังว่าจะเป็นประโยชน์สำหรับคนที่ต้องการใช้งาน Google Cloud Storage ร่วมกับภาษา Go นะครับ โดยสามารถศึกษาหรือค้นคว้าข้อมูลเพิ่มเติมได้ที่ด้านล่างนะครับ

https://godoc.org/cloud.google.com/go/storage

https://cloud.google.com/storage/docs/reference/libraries#client-libraries-usage-go

--

--