---
# System prepended metadata

title: gcp 用法

---

# gcp 用法

![image](https://hackmd.io/_uploads/Bk8d28omC.png)

![image](https://hackmd.io/_uploads/BJRY3LiQC.png)

![image](https://hackmd.io/_uploads/B1os3UjQ0.png)

下載 json


設定方法

`gcloud auth activate-service-account --key-file={json檔位置}`

or 

`export GOOGLE_APPLICATION_CREDENTIALS={json檔位置}`

```go=
package main

import (
	"context"
	"fmt"
	"io"
	"net/http"
	"path/filepath"

	"cloud.google.com/go/storage"
	"github.com/gin-gonic/gin"
)

func main() {
	router := gin.Default()

	// 設置上傳檔案的路由
	router.POST("/upload", func(c *gin.Context) {
		// 從請求中獲取檔案
		file, err := c.FormFile("file")
		if err != nil {
			c.JSON(http.StatusBadRequest, gin.H{
				"error": err.Error(),
			})
			return
		}

		// 獲取檔案的擴展名
		ext := filepath.Ext(file.Filename)

		// 生成唯一的檔案名稱
		filename := fmt.Sprintf("%s%s", generateUniqueID(), ext)

		// 建立 GCS 客戶端
		ctx := context.Background()
		client, err := storage.NewClient(ctx)
		if err != nil {
			c.JSON(http.StatusInternalServerError, gin.H{
				"error": err.Error(),
			})
			return
		}
		defer client.Close()

		// 指定 GCS 儲存桶名稱
		bucketName := "meeting-center-storage-test"

		// 創建一個新的 GCS 物件
		obj := client.Bucket(bucketName).Object(filename)
		writer := obj.NewWriter(ctx)

		// 打開上傳的檔案
		src, err := file.Open()
		if err != nil {
			c.JSON(http.StatusInternalServerError, gin.H{
				"error": err.Error(),
			})
			return
		}
		defer src.Close()

		// 將上傳的檔案複製到 GCS 物件
		if _, err := io.Copy(writer, src); err != nil {
			c.JSON(http.StatusInternalServerError, gin.H{
				"error": err.Error(),
			})
			return
		}

		// 關閉 GCS 物件寫入器
		if err := writer.Close(); err != nil {
			c.JSON(http.StatusInternalServerError, gin.H{
				"error": err.Error(),
			})
			return
		}

		// 返回成功響應
		c.JSON(http.StatusOK, gin.H{
			"message":  "File uploaded successfully",
			"filename": filename,
		})
	})

	router.GET("/download/:filename", func(c *gin.Context) {
		// 獲取 URL 參數中的檔案名稱
		filename := c.Param("filename")

		// 建立 GCS 客戶端
		ctx := context.Background()
		client, err := storage.NewClient(ctx)
		if err != nil {
			c.JSON(http.StatusInternalServerError, gin.H{
				"error": err.Error(),
			})
			return
		}

		// 指定 GCS 儲存桶名稱
		bucketName := "meeting-center-storage-test"

		// 獲取 GCS 物件
		obj := client.Bucket(bucketName).Object(filename)

		// 下載 GCS 物件
		reader, err := obj.NewReader(ctx)
		if err != nil {
			c.JSON(http.StatusInternalServerError, gin.H{
				"error": err.Error(),
			})
			return
		}
		defer reader.Close()

		// 將 GCS 物件的內容複製到 HTTP 響應中
		c.Writer.Header().Set("Content-Disposition", "attachment; filename="+filename)
		c.Writer.Header().Set("Content-Type", "application/octet-stream")
		if _, err := io.Copy(c.Writer, reader); err != nil {
			c.JSON(http.StatusInternalServerError, gin.H{
				"error": err.Error(),
			})
			return
		}
	})

	// 啟動服務器
	router.Run(":8080")
}

func generateUniqueID() string {
	// 生成唯一ID的邏輯，可以根據需要自行實現
	// 這裡僅作為示例，返回一個固定的字符串
	return "123"
}
```