关于 Request,对于图片下载,chunk 和 response body 有什么不同?
发布于 2 年前 作者 dmoneh 1452 次浏览 最后一次编辑是 7 个月前 来自 问答

最近在做一个项目,将db中的图片展示给用户,用node做中间层:浏览器请求图片,node从db中取图片,返回给浏览器。 目前试通的一种方案是

request.get(url).pipe(response);

但是当我想要先获取图片数据,再返回,然后转交给浏览器的response,如下

request.get(url,function(error,res,body){
	return body;
})

发现body并不是图片数据。 但是呢,换下面这种方式,就可以。

var content  = '';
request.get(url)
on('data',function(data){
	content  += data;
});

PS: body比下面content最终形成的文件要大一点。

这是为啥呢?没什么头绪。 求帮助啊! 先谢谢啦!

6 回复

body的话直接返回的是utf8格式(request默认的编码)的二进制图片数据,而chunk则是流形式的二进制数据,按照编码方式的话用utf8编码后的长度自然比源二进制数据长,如果要相等则需要设置对应的编码方式。

你这用法问题有点多

  1. get 然后取 body 的那个用法,取到的 body 不是二进制形式的,可能被强行转换成 utf-8 了。这时候图片面目全非。
  2. on(‘data’) 的那个用法,content 是不能直接 + data 的,因为使用了 + 的话,Buffer 会被隐式转换成 utf-8 字符串。又面目全非了。看看这个:https://github.com/JacksonTian/bufferhelper
  3. 建议按照 1 的思路,想办法直接取到一个 buffer 的结果。

你可以试试这个:https://github.com/alsotang/superagentparse ,跟 superagent 配合使用。

@joney-pinkman

谢谢啦,你说的是对的。默认的body确实是utf-8格式

我设置了一下encoding,如下

request.get({
	url: url,
	encoding: null
})

这个时候,body就是图片数据了。 按照request官方的说法是:If null, the body is returned as a Buffer。 如果设置encoding为null,那么返回的response就是buffer。

再次感谢。

@alsotang

谢谢回复。 大家都很热心啊。:)

  1. 官方说到response body默认是utf-8,除非显示指定options中的encoding。
  2. 事实上我幸运的的没有遇到这个问题,直接用 +data没有出错。不知道是不是遇到body中包含中文才会引起这样的问题。 我看了你的文章, 小心data事件里的chunk拼接。 我很同意你的观点,我们最好不要直接用 +data 这样的方式,无论任何时候。
  3. 我设定了encoding为null,获得到的body就是正常的图片数据了。谢谢。

你提到的两个库,公司刚好正在做一个涉及到中文的项目,我会认真学习一下。

谢谢。

@dmoneh 太感谢了,昨天找弄了一晚,现在用你提供的方法好了,感谢大家的分享!!!

我也补一个坑吧,https://github.com/i5ting/testchunks 专门用于测试chunk的

回到顶部