为了账号安全,请及时绑定邮箱和手机立即绑定

http put 服务器处理大文件

http put 服务器处理大文件

Go
catspeake 2023-07-10 10:41:14
它处理 http PUT 请求。对于小文件,它工作正常:$ curl  -v http://192.168.1.10:9193/ -T red.tx*   Trying 192.168.1.10...* Connected to 192.168.1.10 (192.168.1.10) port 9193 (#0)> PUT /red.tx HTTP/1.1> Host: 192.168.1.10:9193> User-Agent: curl/7.47.0> Accept: */*> Content-Length: 19697247> Expect: 100-continue>< HTTP/1.1 100 Continue* We are completely uploaded and fine< HTTP/1.1 200 OK< Date: Fri, 26 Jul 2019 00:43:43 GMT< Content-Length: 0< Content-Type: text/plain; charset=utf-8<* Connection #0 to host 192.168.1.10 left intact然而 - 发送一个大于 1G 的大文件,它会耗尽内存。这是可以理解的,因为整个正文被读作contents, err := ioutil.ReadAll(r.Body)runtime: out of memory: cannot allocate 536870912-byte block (537919488 in use)fatal error: out of memory    runtime stack:runtime.throw(0x259a35, 0xd)        /usr/lib/go-1.7/src/runtime/panic.go:566 +0x78runtime.largeAlloc(0x1ffffe00, 0x10616f01, 0x10637afc)        /usr/lib/go-1.7/src/runtime/malloc.go:776 +0xc8runtime.mallocgc.func1()        /usr/lib/go-1.7/src/runtime/malloc.go:669 +0x34runtime.systemstack(0x10aa8200)        /usr/lib/go-1.7/src/runtime/asm_arm.s:247 +0x80runtime.mstart()        /usr/lib/go-1.7/src/runtime/proc.go:1079请告诉我从 r.Body 读取并将其写入文件的正确方法。谢谢!
查看完整描述

1 回答

?
倚天杖

TA贡献1828条经验 获得超3个赞

尝试将请求负载直接复制到文件中。


f, err := os.Create(temporaryFilename)

if err != nil {

    return err

}

defer f.Close()


_, err := io.Copy(f, r.Body)

如果您需要对复制的文件执行某些操作,只需操作创建的文件对象(在上面的示例中是f)。


查看完整回答
反对 回复 2023-07-10
  • 1 回答
  • 0 关注
  • 154 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号