http put 服务器处理大文件

它处理 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 +0x78

runtime.largeAlloc(0x1ffffe00, 0x10616f01, 0x10637afc)

        /usr/lib/go-1.7/src/runtime/malloc.go:776 +0xc8

runtime.mallocgc.func1()

        /usr/lib/go-1.7/src/runtime/malloc.go:669 +0x34

runtime.systemstack(0x10aa8200)

        /usr/lib/go-1.7/src/runtime/asm_arm.s:247 +0x80

runtime.mstart()

        /usr/lib/go-1.7/src/runtime/proc.go:1079

请告诉我从 r.Body 读取并将其写入文件的正确方法。谢谢!


catspeake
浏览 155回答 1
1回答

倚天杖

尝试将请求负载直接复制到文件中。f, err := os.Create(temporaryFilename)if err != nil {&nbsp; &nbsp; return err}defer f.Close()_, err := io.Copy(f, r.Body)如果您需要对复制的文件执行某些操作,只需操作创建的文件对象(在上面的示例中是f)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go