求助各位大佬,使用 GO 并发下载壁纸,图片不完整

2019-04-15 16:08:31 +08:00
 d0m2o08

最近在自学 GO,遇到问题不知道怎么解决好了。。。

下载下来的图片都是不完整的

不知道是哪里出了问题。

附上 gist 连接

https://gist.github.com/alinuxsa/c5f6f935db2806cdbb7898a2e482c1b1

1776 次点击
所在节点    程序员
10 条回复
hasdream
2019-04-15 16:32:21 +08:00
直接读取 respone 然后写到文件主要大部分都会这样。 试试下面代码 把 img.Write 修改为 io.Copy
_, err = io.Copy(img, resp.Body)
if err != nil {
log.Fatal(err)
}
d0m2o08
2019-04-15 16:38:43 +08:00
@hasdream
io.Copy 我试过了没有解决,我把 http.Client 的超时时间设置成 150,居然正常了。。
难道 http 请求还没结束,io 就开始像磁盘写文件了么? 好奇怪
ensonmj
2019-04-15 16:44:46 +08:00
说明 http 没有全部返回,就超时了?
kidlj
2019-04-15 16:46:57 +08:00
data, err := ioutil.ReadAll(resp.Body) // 这里检查并 log error

img.Write(data) // 这里检查并 log error
reus
2019-04-15 16:48:23 +08:00
没有检查 err
d0m2o08
2019-04-15 16:52:12 +08:00
@ensonmj 好像是这样,我加了超时时间到 150 秒,就正常了
d0m2o08
2019-04-15 16:54:33 +08:00
@kidlj 这个地方忘了,哈哈哈,我还原回去加上试一下
kidlj
2019-04-15 17:14:03 +08:00
@d0m2o08 我试了下,跟那个两个 error 没有检查没有关系,就是因为超时了,所以只写入部分数据。

ioutil.ReadAll(resp.Body) error: net/http: request canceled (Client.Timeout exceeded while reading body)
kidlj
2019-04-15 17:15:20 +08:00
@kidlj 不对,

data, err := ioutil.ReadAll(resp.Body) // 这里还是应该检查并 log error
d0m2o08
2019-04-16 09:18:12 +08:00
@kidlj ReadAll 的时候,打印了错误

stream error: stream ID 13; PROTOCOL_ERROR

好像请求还没结束,连接就断开了,响应的数据不完整

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/555361

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX