gpt4 book ai didi

go - 将文件上传到Google存储而不将其保存到内存

转载 作者:行者123 更新时间:2023-12-02 23:35:56 27 4
gpt4 key购买 nike

我想将文件从前端直接通过后端上传到 Google 存储桶中,而不是先将其完全保存在服务器的内存中。我添加了一个类似于 example 的端点来自谷歌文档并且它有效。但是,我不确定这是否会首先将整个文件保存到内存中,因为这可能会导致上传较大文件时出现问题。

如果它首先将文件保存到内存中,我该如何更改代码,以便将上传内容直接流式传输到 Google Storage。类似问题的答案并没有澄清我的问题。

谢谢

func Upload(c *gin.Context) {
file, _, _ := c.Request.FormFile("image")
ctx := context.Background()

client, err := storage.NewClient(ctx)
if err != nil {
fmt.Printf("Failed to create client with error: %v", err)
return
}

bucket := client.Bucket("test-bucket")

w := bucket.Object("testfile").NewWriter(ctx)

w.ContentType = "image/jpeg"

io.Copy(w, file)
w.Close()
}

最佳答案

正如 Peter 对问题和答案的评论中所述,请使用 multipart reader directly读取请求正文。

func Upload(c *gin.Context) {
mr, err := c.Request.MultipartReader()
if err != nil {
// handle error
return
}
var foundImage bool
for {
p, err := mr.NextPart()
if err == io.EOF {
break
}
if err != nil {
// handle error
return
}
if p.FormName() == "image" {
foundImage = true

ctx := context.Background()
client, err := storage.NewClient(ctx)
if err != nil {
// handle error
return
}
bucket := client.Bucket("test-bucket")
w := bucket.Object("testfile").NewWriter(ctx)
w.ContentType = "image/jpeg"
if _, err := io.Copy(w, p); err != nil {
// handle error
return
}
if err := w.Close(); err != nil {
// handle error
return
}
}
}
if !imageFound {
// handle error
}
}

//handle error 注释替换为以适当的错误状态响应客户端的代码。记录一些错误也可能很有用。

关于go - 将文件上传到Google存储而不将其保存到内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59053277/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com