บันทึกการเชื่อมต่อ Google Cloud Storage ด้วย Go Part2(การอัพโหลดรูปภาพด้วย API)
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: PUT ที่ด้านในมี Path ตามที่ได้คิดไว้และภายในจะเรียกไปยัง handler ที่เราจะสร้างขึ้นใหม่ที่ชื่อว่า uploadProfileImage
ต่อมาเราจะสร้าง handler ที่ชื่อว่า uploadProfileImage ที่ด้านในจะต้องทำการอัพโหลดไฟล์รูปให้กับเรา โดยจะต้องมีการดึงข้อมูลของไฟล์ที่ได้รับมาจาก API ด้วย c.MultipartForm() และทำการตรวจสอบข้อมูลก่อนว่าได้อัพโหลดรูปด้วย key ที่ชื่อว่า “images” ผ่านมาทาง Form-data มาหรือเปล่า ถ้าไม่ใช้จำเป็นจะต้องส่งค่า Error กลับไปให้ด้วย
ในส่วนนี้จะเป็นการเช็คเงื่อนไขของขนาดไฟล์รูปที่อัพโหลดเข้ามาว่าจะต้องมีขนาดไม่เกิน 5 mb โดยถ้าเกินจะทำการ return สถานะ BadRequest หรือ 400 กลับไปพร้อมกับข้อความและรหัส ErrorCode
และอีกเงื่อนไขหนึ่งคือจะต้องเช็คว่าไฟล์ที่อัพโหลดเข้ามานั้นจะต้องเป็นไฟล์ที่มีนามสกุลลงท้ายด้วย .png เท่านั้น โดยถ้าพบไฟล์ประเภทอื่นจะทำการ return สถานะ BadRequest หรือ 400 กลับไปพร้อมกับข้อความและรหัส ErrorCode
การอ่านค่า Data จากรูปเพื่อใช้ในการอัพโหลด โดยเมื่ออ่านค่าจะได้ src ที่เป็น multipart.File มา และอย่าลืมสั่งปิดด้วย Close()
ก่อนหน้าที่เราจะทำการอัพโหลดไฟล์ไปที่ Google Cloud Storage เราจะต้องสร้างตำแหน่งของไฟล์ที่จะต้องใช้ในการอัพโหลดกันก่อน โดยสร้างให้อยู่ในรูปแบบที่ได้คิดไว้ก่อนหน้า “userId/profile/user_profile.png” หลังจากนั้นเราก็จะทำเรียก method uploadImageGCloud เพื่อทำการ อัพโหลดรูปให้เรา
ประกาศเมธอดที่ด้านในมีการเรียก storage.NewClient ด้วย context ที่รันแบบ background เพื่อใช้ในการเชื่อมต่อกับ Google Cloud Storage รวมถึงประกาศตัวแปรที่เก็บชื่อของ bucket ไว้
มาถึงขั้นตอนในการอ้างถึงตำแหน่ง pathImage ที่อยากจะไปวางไว้โดยใช้ path ตามที่เราได้ประกาศไว้และชื่อ bucket ที่ได้ประกาศไว้ โดยจะต้องเรียกเมธอด NewWriter เพื่อใช้ในการเขียนไฟล์
ตัวแปร wc ที่เรารับค่ามาจากเมธอด newWriter() จะมี Type เป็น Writer ของ Storage ที่เราจำเป็นต้องใช้ในขั้นตอนอัพโหลดไฟล์ไปที่ Google Cloud Storage
ขั้นตอนต่อไปเราจะเรียก io.copy เพื่อสั่งให้ทำการเขียนไฟล์ที่อัพโหลดเข้ามาไปเก็บในตำแหน่ง pathImage ที่เราตั้งไว้ โดย param ตัวแรกจะเป็นตัว Writer ที่เราได้รับมาก่อนหน้าและ param ตัวที่สองคือไฟล์ที่เราได้รับมาจาก API โดยถ้าเอาอัพโหลดผิดพลาดก็จะส่ง error กลับไปที่คนเรียก API
โดยเมื่อเราใช้งานเสร็จเรียบร้อยแล้วก็อย่าลืมที่จะปิดการเชื่อมต่อ หลังจากที่ทำงานทุกอย่างเสร็จแล้วและไม่มี error เกิดขึ้น เราก็ตอบกลับด้วยสถานะ 200 กลับไปที่ฝั่งคนเรียกใช้ API เพื่อบอกว่าทุกอย่างทำงานเสร็จสมบูรณ์เรียบร้อยแล้วนะครับ
Proof it’s work
ทดลองอัพโหลดไฟล์ผ่าน API ด้วย Postman กันดูโดยตั้งค่า Body เป็น form-data แล้วใส่ KEY เป็น “images” และทำการเลือกไฟล์ที่จะอัพโหลดใส่ลงไปด้วย หลังจากนั้นก็กดยิง API เลยครับ
หลังจากที่รอ response จาก API จนได้รับสถานะ 200 OK เพื่อยืนยันว่ารูปที่เราได้พึ่งอัพโหลดไปสำเร็จแล้วจริงๆ
เข้าไปเช็คสถานะการอัพโหลดไฟล์ว่าไฟล์รูปภาพได้ถูกไปวางที่ตำแหน่งที่เราได้ตั้งค่าไว้หรือไม่ และมีรูปหรือเวลาอัพโหลดที่ใกล้เคียงกันหรือเปล่า
เราสามารถกดเข้าไปดูรูปที่เราอัพโหลดเข้าไปได้ด้วยการกดที่ชื่อรูป และก็จะเจอกับรุปที่เราพึ่งอัพโหลดเข้าไปด้วย 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