将文件上传到Google Storage而不将其保存到内存 [英] Uploading file to Google Storage without saving it to memory

查看:33
本文介绍了将文件上传到Google Storage而不将其保存到内存的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想通过后端直接将文件从前端上传到Google Storage存储桶中,而不是首先将其完全保存在服务器的内存中。我已经从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注释替换为使用适当错误状态响应客户端的代码。记录一些错误可能也很有用。

这篇关于将文件上传到Google Storage而不将其保存到内存的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆