跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 求助: gin 大文件上传
未分類
6 2 月 2021

求助: gin 大文件上传

求助: gin 大文件上传

資深大佬 : MarkMelon 7

目的: 让 http body 中全是文件内容, 不包含其他东西。

因为大文件直接上传到服务器上会占用大量内存, 为了节省内存采用了流式读取 http body, 然后写入文件
但是 body 中可能有其他 post 参数, 如何边读边解析出文件内容和这些参数呢?

已知可以让前端 body 采用 binary 格式, 但是受限于前端组件不支持这种格式, 推进很困难。

大佬有話說 (13)

  • 資深大佬 : shoaly

    拆分, 把单纯的文件上传剥离出来, 上传好来 返回一个 media_id , 然后将 media_id 和 其他 post 参数 再第二次传过来

  • 主 資深大佬 : MarkMelon

    @shoaly 首先感谢。 我们现在已经让前端把大文件拆成小文件上传了。
    现在要解决的是, 流式读取 body 并保存到文件中。 比如每次从网卡里读 4k 这样的。
    但是 body 里 form/data 会有分隔符还有其他参数。 如何在流式读取过程中把文件和这些参数区分开

  • 資深大佬 : shoaly

    @MarkMelon 是说把文件上传 和 其他参数上传拆开, 文件先上传 变成 参数之一

  • 資深大佬 : Jirajine

    把文件和其他参数混到一个 body 中不是合适的做法,但即使这么作了也不影响流式解析。以 JSON 为例,先搞个 json.Decoder 把那些参数读出来,然后剩下的在写到磁盘。

  • 主 資深大佬 : MarkMelon

    @Jirajine 主要是如何在读流的过程中解析参数

  • 主 資深大佬 : MarkMelon

    @shoaly 这种可能违背了需求本身了

  • 資深大佬 : jindeq

    form-data 形式的表单是支持的,我现在也有个接口在用。gin 可以取 body 里的参数和文件

  • 資深大佬 : Jirajine

    @MarkMelon 要是文件数据包含到参数里面那就稍微麻烦点,你得手动解析。
    具体就是流式地读,读到参数部分就解析出来,读到文件部分就写到磁盘上,再读到参数部分再解析出来,以此类推。

  • 資深大佬 : matrix67

    上传大文件还挺麻烦的,这个 1.1k ,go 下面 star 最多的 httpserver,实现的就有问题,大文件上传会挂掉。

    https://github.com/codeskyblue/gohttpserver/issues/98

  • 資深大佬 : loading

    还没有分片上传然后合并的中间件吗?坐等一个最优解。

  • 資深大佬 : zu1k

    其实完全不需要担心,net/http 在 readForm 的时候如果文件超过指定的最大内存占用,会自动写入临时文件,所以根本不会占用太多内存

    https://github.com/golang/go/blob/master/src/mime/multipart/formdata.go#L91

  • 資深大佬 : coosir

    https://github.com/fabu-dev/fabu.dev
    这个项目里面上传文件用到了分片与合,可参考
    可以追下 /api/application/service/app.go 中的 Upload 方法

  • 主 資深大佬 : MarkMelon

    跪谢大家的回复 @Jirajine 这个可能是最优解 也是我想要的, 现在就是找一些比较标准的解析方案

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具