[GOLANG] สร้าง QR Code พร้อมอัปโหลด ขึ้น Google Cloud Storage ด้วย Golang

Wasin Khaojaroen
THE EXISTING COMPANY
3 min readJan 20, 2020

Google Cloud Storage คืออะไร ?

Google Cloud Storage คือหนึ่งในบริการของ Google Cloud Platform (GCP)ซึ่งจะทำให้คุณสามารถอัปโหลด และดาวน์โหลดไฟล์ของคุณใน Google Cloud Storage ได้นั่นเอง โดยในบทความนี้ เจ้าของบทความ (จขบ.) จะไม่ขอลงลึกในรายละเอียดมากนะครับ หากสนใจสามารถอ่านเพิ่มได้ที่ลิงค์นี้นะครับ https://blog.datath.com/google-cloud-platform-1-compute/#Google_Cloud_Platform_khux_xari_thami_rea_thung_txng_chi ต้องขอบคุณสำหรับบทความดีๆของคุณ Perth N มา ณ ที่นี้ด้วยนะครับ

ก่อนอื่นมาเตรียมเครื่องไม้เครื่องมือกันก่อน

  • 1. เจ้าตัวภาษา Golang
  • 2. บัญชี Google Cloud Platform หรือ เรียกสั้นๆว่า GCP
  • 3. Key ในการเข้าถึงโปรเจคของเราบน GCP วิธีการสร้าง key จะอยู่ด้านล่างนี้นะครับ

อันดับแรกเข้าไปที่ https://cloud.google.com/ สมัคร และทำตามขั้นตอนจนเสร็จ *** (จำเป็นต้องสมัครทดลองใช้งานฟรีเพื่อเปิดใช้งาน Google Cloud Storage หลังจากนี้จะขอเรียกสั้นๆว่า GCS นะครับ) จากนั้นเลือกไปที่ Project ที่ต้องการเข้าถึง GCS ดูที่มุมซ้ายบนจะมีเจ้า Hamberger Menu กด 1 ครั้ง จะมี List ของ Services ต่างๆ ขึ้นมาให้เอาเม้าส์ชี้ไปที่ APIs & Servives และเลือก Credentials แล้วก็ Create Credentials จะมีให้เลือก 3 อย่าง โดยในทีนี้ จขบ. ได้เลือกเป็นตัว Service Account Key เมื่อเลือกแล้วจะได้หน้าตาขึ้นมาแบบนี้

Create service account key form

ใส่ชื่อ Service Account Name และ เลือก Role สำหรับตัวอย่างนี้ จขบ. เลือกเป็น Owner เพื่อให้ง่ายต่อการต่อการอธิบายสำหรับตัวอย่างในครั้งนี้นะครับ ต่อไปเป็นส่วนของ Key Type ให้เลือกเป็น JSON แล้วกด Create จากนั้นจะได้ไฟล์ JSON มาซึ่งไฟล์ตัวนี้คือ Key ในการเข้าถึง GCS ของเรานั่นเอง

หากเตรียมทุกอย่างพร้อมแล้วงั้นเรามาลุยกันเลย…!!!

  • เริ่มด้วยการสร้าง Project กันก่อนเลยโดยในทีนี้ จขบ. สร้างโฟลเดอร์ที่มีชื่อว่า example-qr-code โดยข้างในจะประกอบไปด้วย
  • ไฟล์ main.go โฟลเดอร์ qr-code-management ที่บรรจุ Package Controllers และโฟลเดอร์ gcp-connection ที่มีไฟล์ gcp.go อยู่ข้างในเพื่อเอาไว้เรียกใช้ใน main.go โดยหน้าตาโครงสร้าง Project จะประมาณนี้
Project Structure

หลังจากวางโครงสร้างเสร็จแล้วอย่างแรกมาเริ่มกันที่เจ้าไฟล์ gcp.go โดยในไฟล์นี้จะมีฟังก์ชันสำหรับการเชื่อมต่อกับ GCS สามารถดู และทำตามตามรูปตัวอย่างด้านล่างนี้ได้เลยนะค้าบบ

คำอธิบายประกอบด้านล่าง

ฟังก์ชันสำหรับการเชื่อมต่อกับ GCS

  • ทำตามด้านล่างนี้เลยนะครับ ในหน้าต่าง Terminal พิมพ์ว่า
go get cloud.google.com/go/storagego get google.golang.org/api/option
  • ที่เหลือก็ Import Package เข้ามาตามโค้ดตัวอย่างเลยนะครับ
  • จากรูปด้านบนนี้จะเห็นว่ามี Func GcpConnection() ซึ่งฟังก์ชันนี้จะใช้ในการเชื่อมต่อกับ GCS ของเรานั่นเองโดย option.WithCredentialsFile ก็คือฟังก์ชันที่อยู่ใน Package “google.golang.org/api/option” เพื่อให้เราแนบ Key ที่ได้ทำการสร้างไว้ตั้งแต่ตอนต้น(หากใครยังไม่ได้สร้างให้เลื่อนกลับขึ้นไปดูข้างบนก่อนนะครับ) โดยในที่นี้ จขบ. ได้เก็บไว้ใน .env ไฟล์ เพื่อความปลอดภัยนะครับ หาก Key ถูกต้อง และไม่เกิด Error อะไรฟังก์ชันนี้จะทำการ return ค่า Client กลับไป เพื่อให้ฟังก์ชันที่ต้องการเข้าถึง GCS นำไปใช้งานต่อ
  • ประกาศ Key ใน .env ไฟล์ โดยใส่ key.json ไว้ใน Path เดียวกันกับ .env ไฟล์
key = ./key.json

หลังจากทำการเชื่อมต่อกับ GCS เสร็จเรียบร้อยแล้วเราจะข้ามมาทำในส่วนของการ Generate QR Code กันเลยนะครับ โดยจะอยู่ในส่วนของไฟล์ services.go ซึ่งในไฟล์นี้จะมีฟังก์ชันที่เอาไว้ Generate QR Code สามารถทำตามรูปภาพประกอบด้านล่างนี้ได้เลยนะครับ

คำอธิบายประกอบด้านล่าง

ฟังก์ชันสำหรับการสร้าง QR Code

  • ขั้นตอนแรกเหมือนเดิมเลยครับไปที่หน้า Terminal แล้วก็
go get github.com/skip2/go-qrcode
  • ต่อมาเรามาเริ่มกันที่ qrcode.Encode(data,error recovery,size) Parameter ตัวแรกจะเป็นข้อมูลที่เราต้องการ Encode
  • ถัดมาจะเป็นการ Error Recovery ซึ่งเจ้านี้จะช่วยในกรณีที่ QR Code ของเราไม่สมบูรณ์หรือมีอะไรมาบดบังบางส่วนของ QR Code เช่น ถ้าเราเอานิ้วไปปิด QR Code บางส่วนแต่ QR Code นั้นก็ยังสามารถสแกนได้โดยจะมีด้วยกัน 4 Level คือ Low, Medium, High, Highest หากยังไม่เข้าใจสามารถดูตัวอย่าง และอ่านเพิ่มได้ที่ลิงค์นี้นะครับ https://blog.qr4.nl/post/QR-Code-Error-Recovery.aspx
  • ตัวสุดท้ายคือ ขนาด ในตัวอย่าง จขบ. ใช้เป็น 256 ซึ่งจะเท่ากับ ขนาด 256 * 256 นั่นเอง โดยเมื่อจบการทำงานของฟังก์ชันนี้หากไม่เกิด Error อะไรจะ return ค่า QR Code ที่ได้มานั้นกลับไปโดยค่านั้นจะถูกเก็บในรูปแบบ []byte

!!! ง่ายๆไม่ถึง 15 บรรทัด แค่นี้เราก็ได้ QR Code มาแล้ววววหรอเนี่ย !!!

เมื่อได้ QR Code มาแล้วก็ถึงเวลาในการอัปโหลด QR Code ขึ้น GCS ของเราซักทีนะครับ โดยให้กลับไปที่เจ้า gcp.go แล้วเขียนฟังก์ชันสำหรับการอัปโหลด QR Code ของเราขึ้นไปบน GCS กันมาเริ่มกันเลยนะครับ

คำอธิบายประกอบด้านล่าง

มาเริ่มอัปโหลด QR Code ขึ้นไปบน GCS กันเถอะ

  • เพื่อให้รวบรัดในการอธิบาย จขบ. จะรวมฟังก์ชันนี้ไว้ในไฟล์ gcp.go นี้เลยนะครับมาดูกันทีละบรรทัดเลยนะครับ
  • เริ่มที่บรรทัดแรกตัวแปรที่ชื่อว่า bucket ก็คือชื่อของ Bucket ที่เราสร้างไว้บน GCS ของเราซึ่งต้องไปทำการสร้างไว้ก่อนนะครับ ต่อมาเป็นชื่อไฟล์ที่เราจะเอาไว้เก็บข้อมูล QR Code ถัดมาอีก จะเป็นการสร้างไฟล์เพื่อเอาไว้เก็บค่าของตัว QR Code ของเรานะครับ ตัว defer file.Close() คือจะทำการปิดการเข้าถึงไฟล์ที่เราเพิ่งสร้างหลังจากจบฟังก์ชันนี้แล้ว
  • มาที่ ioutill.WriteFile(FileName or Path, data, permission) ใน Parameter ตัวแรกก็คือชื่อไฟล์ หรือ path ของไฟล์ที่เราต้องการที่จะเขียนข้อมูลลงไป ตัวที่สองก็ตรงตัวเลยก็คือข้อมูลที่เราต้องการเขียนลงไปในไฟล์โดยในที่นี้ก็คือเจ้า QR Code ของเรานั่นเองครับ ตัวสุดท้ายจะเป็น Permission
  • มาๆลุยต่อกันบรรทัดที่ 32–39 เลยนะครับโดยในส่วนนี้จะเป็นอัปโหลดไฟล์ เริ่มที่ client.Bucket(bucketName).object(fileName).NewWriter(ctx) ctx ก็คือ context.Background() ซึ่งผมได้ประกาศไว้ในฟังก์ชัน main ใน main.go น่ะครับโดยสามารถดูรูปด้านล่างประกอบได้น่ะครับ ต่อมาก็ประกาศตัวแปร err เพื่อเอาไว้รับค่า Error จาการเขียนข้อมูลลงไปใน Bucket ของเรา io.Copy() ง่ายๆก็เหมือนการ Copy File นั่นแหละครับ โดยมันจะอ่านข้อมูลจาก file แล้วนำไปเขียนลงใน wc ซึ่งก็คือที่อยู่ของ file ที่เราสร้างไว้แล้วจากโค้ดบรรทัดก่อนหน้า สุดท้ายก็เป็นการปิดการเข้าถึงไฟล์นั้นบน GCS เท่านี้ก็เป็นอันเรียบร้อย

เสร็จแล้วไฟล์ gcp.go ของเราจะมีหน้าตาแบบนี้สามารถ Copy ทั้งหมดแล้วนำไปวางได้เลยนะครับ

ท้ายยสุด และสุดท้ายยยที่ไฟล์ main.go

อย่าลืม !!!

go get github.com/joho/godotenv

ในไฟล์นี้เราจะเรียกใช้ฟังก์ชันทั้งหมดที่เราสร้างแยกไว้ในแต่ละโฟลเดอร์มารวมกันและหน้าตาของ Project ทั้งหมดก็จะประมาณนี้นะครับ ยังไงก็ลองเอาไปลองทำลองเล่นกันดูได้นะครับบบบ :D

Originally published at https://medium.com on January 20, 2020.

--

--