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

2024-01-01

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

如果它首先将文件保存到内存中,我如何更改代码,以便将上传直接流式传输到 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()
}

正如彼得对问题和答案的评论中所述,使用直接多部分阅读器 https://godoc.org/net/http#Request.MultipartReader读取请求正文。

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使用代码进行注释,以适当的错误状态响应客户端。记录一些错误也可能很有用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将文件上传到Google存储而不将其保存到内存 的相关文章

  • Xhr上传event.loaded问题

    opts xhr function var xhr new window XMLHttpRequest Upload progress xhr upload onprogress function e if e lengthComputab
  • ios 使用 HTTP POST 上传图像和文本

    谢谢阅读 我是 iOS 新手 我正在尝试使用上传图像和文本multi part form encoding在 iOS 中 The curl等价的是这样的 curl F param1 value1 F email protected cdn
  • Go 编程语言中的“方法需要指针接收器”

    我刚刚看到了 Go 编程语言的演示 并想尝试写几行 一切工作正常 直到我尝试在这种情况下使用界面 我该如何解决这个问题 package main import fmt type entity float32 func e entity in
  • bazel go_embed_data“无法嵌入”

    我将以下 bazel BUILD 配置为 gazelle name gazelle go embed data name static files srcs glob static package main var staticFS go
  • 如何在 PHP 中上传 .txt 文件并在另一页面上逐行读取该文件?

    我的目标是在表单上上传 txt 文件 浏览 将文件发布到另一个 php 页面 然后逐行读取该文件 到目前为止我的代码就在这里 文件 1 HTML 上传
  • Google Storage python api并行下载

    使用以下命令并行下载大量文件到本地计算机是很简单的gsutil https cloud google com storage docs gsutil commands cp通过添加 m flag gsutil m cp gs my buck
  • 交叉编译共享库

    我想知道是否有可能 如果是的话 如何 与 Go 交叉编译共享库 假设我有这段代码 package main import C export DoubleIt func DoubleIt x int int return x 2 func m
  • 指针和切片引用类型 - 接收器

    我认为一旦向我提出这个问题就会有点明显 但现在以下内容还没有点击 type Stack interface func stack Stack Push x interface stack append stack x 我有一个名为 Stac
  • 非本地包中的本地导入

    我知道应该避免本地进口 但在这种情况下有特殊情况需要 这是一个私人仓库 heroku buildpack 在go get 由于服务器上缺少私钥 与绝对 URL 一起使用时会出现此阶段 现在我得到这个错误local import in non
  • http:多余的response.WriteHeader调用

    我有一个HandleFunc 如果成功的话 我希望 显然 能够 sent a 200回复 在回复中写一条信息性消息 但是以下代码片段 在快乐路径中执行 if fullRun w Write byte successMsg w WriteHe
  • 如何使用签名网址将文件上传到谷歌云存储桶

    我正在开发一个 Angular 应用程序 用于显示谷歌云存储桶的内容 对于后面 我在nodeJS中使用谷歌云功能 正如他们在上传文件的文档中提到的 我创建了一个函数来生成签名 url 但是当我使用签名 url 发送文件时 我在浏览器中收到了
  • golang 将 big.Float 转换为 big.Int

    将big Float转换为big Int 我在下面编写代码 但它溢出了uint64 那么将big Float转换为big Int的正确方法是什么 package main import fmt import math big func Fl
  • go install - 我需要手动更新我的路径吗?

    我对 Go 的最新最佳实践是什么有点困惑 在 macos 上安装最新的 1 17 Go 没有 GOPATH 环境变量 使用 go mod 我看到我的路径中有以下内容 usr local go bin 当我跑步时go install
  • MIME 多部分流意外结束。 MIME 多部分消息不完整。 Web API 和超级代理

    我在将文件从客户端上传到 Web api 时遇到问题 我收到此错误 MIME 多部分流意外结束 MIME 多部分消息不完整 当我尝试读取多部分内容时在控制器中 我正在使用 superagent 构建一个 React JS 客户端 这是我的请
  • 从多个“输入:文件”中删除 FileList 项

    我有这个 DOM var id 0 input file upload 0 files id 这是第 0 个索引上的第一个文件 列出了文件属性并且一切正常 但是 我们如何从 DOM 中删除项目 object FileList 使用 Java
  • Go中通过反射给struct成员赋值

    我有一个结构 v 其中包含成员 A B C 字符串 使用反射 我可以获得字段的名称及其值 typ v Type for i 0 i lt v NumField i gets us a StructField fi typ Field i f
  • Instagram 如何使用 Amazon S3?

    在将文件上传到 Amazon S3 时 我需要深入了解 Instagram 的工程 我刚刚开始使用 S3 我认为 Instagram 是一个值得效仿的好模式 因为他们每天上传数千张图片 我的应用程序有点相似 用户上传图片 可以删除自己的图片
  • 如何使用 django (python) 和 s3 上传文件?

    我正在寻找一种将文件上传到 s3 的方法 我正在使用 django 我目前正在使用亚马逊的 python 库进行上传以及以下代码 View def submitpicture request fuser request session lo
  • 将参数传递给 http.HandlerFunc

    我正在使用 Go 的内置 http 服务器pat http github com bmizerany pat响应某些 URL mux Get products http HandlerFunc index func index w http
  • 如何在Go包之间共享测试接口?

    Go 不会在不同包的测试文件之间共享代码 因此测试接口的定义不会自动重用 在实践中我们如何解决这个问题 使用示例testing quick foo foo go package foo type Thing int const X Thin

随机推荐

  • Python TypeError:不支持的操作数类型 -:“float”和“NoneType”

    有谁知道为什么我会收到这样的错误 TypeError unsupported operand type s for float and NoneType 如果你这样做 我将非常感激 我对此很陌生 正在努力学习 但我真的陷入了 Python
  • 将模型传递给局部视图

    我有一个 Address 部分视图 该部分视图包含与地址模型匹配的所有地址字段 在此视图的顶部 我将模型设置如下 模型数据 地址 在我的 CustomerInfo 视图中 我尝试以下操作将地址字段呈现为表单的一部分 Html Partial
  • git - 默认推送到 --recurse-submodules=check

    我总是忘记推送子模块 有时我忘记添加 recurse submodules check to git push 更糟糕的是 我团队中的其他人可能也会这样做 有没有git config我们可以设置的选项check默认值 Git v2 7 0
  • Task.Delay().Wait() 发生了什么?

    我很困惑为什么Task Delay Wait takes 4 倍多的时间 then Thread Sleep E g task 00正在运行仅线程 9并采取了2193ms 我知道 同步等待在任务中很糟糕 因为整个线程被阻塞 它只是为了测试
  • 清除 MATLAB 中的类定义

    命令clear classes清除当时加载到内存中的所有类定义 是否可以仅清除特定的类定义 编辑 我有兴趣删除特定的课程定义来自内存 而不是类实例 当我编写新的 HPF 类时 我自己也遇到了这个问题 所以我尝试了一些事情 因为当我调试新类时
  • CI/CD 的 Helm 图表版本

    我为 CI CD 管道设置了一个 helm 存储库 但我遇到的一件事是 helm 的版本控制系统 该系统专注于语义版本控制系统 如下所示x x x 我希望能够指定 暂存 最新 和 生产 等标签 尽管我能够成功上传带有字符串版本的图表 NAM
  • 全文搜索和 Python

    有人可以帮我推荐一个支持 Python 的全文搜索引擎吗 现在我们已经有了一个 MySQL 数据库 我想添加一个功能 让全文搜索引擎索引该数据库中某些表中的某些文本 Web 应用程序将使用此文本数据来搜索数据库中的相应记录 例如 在客户表中
  • 正则表达式匹配非行首

    我有以下 XML 标签
  • Jquery .serialize() 不处理下拉列表的值?

    我认为这应该是一件简单的事情 但由于某种原因 除了下拉列表的选定值之外 我的所有表单值都被很好地序列化 表单如下
  • C#.net 将带有附件的电子邮件排队发送的最佳方法

    我正在寻找一种更安全地从我们的应用程序发送电子邮件的方法 目前 我们直接将电子邮件发送到 IIS SMTP 服务器 但正在寻找在服务器出现故障 重新启动等情况下更安全地传送电子邮件的方法 我正在考虑实现此目的的一种方法是将电子邮件 带有附件
  • AttributeError:“AuthorizedSession”对象没有属性“configure_mtls_channel”

    我正在使用 Cloud Composer 编排两个数据流作业 并且一个月以来运行良好 突然 这两个作业停止工作 并出现以下错误消息 在 download blob 文件中 usr local lib python3 6 site packa
  • 更改 MKMapView 的地图类型

    我正在尝试开发一个界面 供用户更改mapType 视图 我想通过在地图视图的右下角添加折叠效果来实现这一点 用户可以在右下角按下或按下并拖动 地图将折叠起来足以显示 3 种不同的地图类型 常规 混合和卫星 这与 iPhone 上的谷歌地图具
  • Bootstrap JS 函数未在 Rails 6/Webpacker 中加载

    使用 Webpacker 和 Rails 6 攀登学习曲线 我已经使用 Yarn 和 Webpack 安装了 Bootstrap 4 当我尝试在浏览器的 JS 控制台中使用 Bootstrap 组件时 我得到 TypeError fn bu
  • Twitter BootStrap 模态窗口后备链接

    我正在使用 Twitter Bootstrap 模式窗口 以防万一模态窗口由于 js 错误而无法工作 有一个后备页面 如果模式窗口未加载 如何确保页面已加载 打开模态窗口的链接 a href login modal Login a 模态窗口
  • 如何将本地文件夹连接到 Git 存储库并开始在分支上进行更改?

    我是源代码管理新手 过去 我手动备份文件副本并对克隆进行更改 然后在调试后将更改手动传输到主文件 我意识到这类似于分支与 Git 存储库的工作方式 但我从未使用过 我下载了 Git 并在 GitLab 上注册了一个帐户 并开始了一个新项目
  • Haxe——像 ActionScript 一样嵌入文件?

    在 ActionScript 中 您可以执行以下操作 Embed source src myfile xml mimeType application octet stream private var xml Class 它会嵌入您的文件以
  • 先前操作未完成的问题

    我对 Linux 相当陌生 我正在尝试安装 openCV 软件 我正在安装一些东西 突然断电并且中断了 当我重新安装它时 我不断收到此错误 svn E155037 Previous operation has not finished ru
  • 使用 argparse 调用函数[重复]

    这个问题在这里已经有答案了 我在从 argpars 调用函数时遇到问题 这是我的脚本的简化版本 可以打印我给 s 或 p 的任何值 import argparse def main parser argparse ArgumentParse
  • 如何用 JavaScript 创建一个猜数字游戏?

    我需要创建一个猜数游戏 使用它接收一个值document getElementById并将其输出到
  • 将文件上传到Google存储而不将其保存到内存

    我想将文件从前端直接通过后端上传到Google存储桶中 而不是先将其完全保存在服务器的内存中 我添加了一个类似于以下的端点example https cloud google com go getting started using clo