登录
首页 >  Golang >  Go问答

如何以低内存占用处理大文件上传?

来源:stackoverflow

时间:2024-04-25 19:00:34 456浏览 收藏

目前golang学习网上已经有很多关于Golang的文章了,自己在初次阅读这些文章中,也见识到了很多学习思路;那么本文《如何以低内存占用处理大文件上传?》,也希望能帮助到大家,如果阅读完后真的对你学习Golang有帮助,欢迎动动手指,评论留言并分享~

问题内容

我正在用 go 编写一个应用程序,用户可以在其中上传文件,该文件最终会上传到 amazon s3 存储桶。我编写了一个端点,用户可以使用该端点将文件作为多部分表单数据上传。文件上传后,我会将其上传到 s3 存储桶。

func UploadRoutes(route *gin.Engine) {
    route.POST("/upload", uploadHandler)
}

func uploadHandler(context *gin.Context) {
    fileHeader, err := context.FormFile("file")
    // check err

    file, err := fileHeader.Open()
    // check err

    // uploads to S3 bucket   
    err = utils.Upload(file, fileHeader.Filename)
}

但我不确定两次上传之间上传的文件数据存储在哪里。似乎文件在用户上传完成后和上传到 s3 存储桶之前会在内存中(参考:https://pkg.go.dev/mime/multipart#file)

如果是这样的话,大文件上传会消耗过多的服务器内存。作为一种解决方法,我可以考虑将文件写入磁盘,然后启动分段上传到 s3 存储桶。有更好的选择吗?

这是一个相关的问题,但我想我已经按照答案中的建议使用分段上传:aws s3 uploading/downloading large files with low memory footprint


正确答案


您可以使用upload,您可以将多部分读取器直接传递到s3,而不是在上传之前将文件存储在服务器中

func uploadHandler(context *gin.Context) {
    fileHeader, err := context.FormFile("file")
    // check err
    config := &aws.Config{
        Region: aws.String("us-west-1"), // your region here 
    }
    AwsSession := session.Must(session.NewSession(config))
        uploader := s3manager.NewUploader(AwsSession)
        result, err := uploader.Upload(&s3manager.UploadInput{
        Bucket:      aws.String(bucketname),
        Key:         aws.String(filePath),
        Body:        fileHeader, // you can pass the reader here 
    })  
}

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>