最近在做一个项目,将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最终形成的文件要大一点。
这是为啥呢?没什么头绪。 求帮助啊! 先谢谢啦!
body的话直接返回的是utf8格式(request默认的编码)的二进制图片数据,而chunk则是流形式的二进制数据,按照编码方式的话用utf8编码后的长度自然比源二进制数据长,如果要相等则需要设置对应的编码方式。
你这用法问题有点多
- get 然后取 body 的那个用法,取到的 body 不是二进制形式的,可能被强行转换成 utf-8 了。这时候图片面目全非。
- on(‘data’) 的那个用法,content 是不能直接 + data 的,因为使用了 + 的话,Buffer 会被隐式转换成 utf-8 字符串。又面目全非了。看看这个:https://github.com/JacksonTian/bufferhelper
- 建议按照 1 的思路,想办法直接取到一个 buffer 的结果。
你可以试试这个:https://github.com/alsotang/superagentparse ,跟 superagent 配合使用。
谢谢啦,你说的是对的。默认的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。
再次感谢。
谢谢回复。 大家都很热心啊。:)
- 官方说到response body默认是utf-8,除非显示指定options中的encoding。
- 事实上我幸运的的没有遇到这个问题,直接用 +data没有出错。不知道是不是遇到body中包含中文才会引起这样的问题。 我看了你的文章, 小心data事件里的chunk拼接。 我很同意你的观点,我们最好不要直接用 +data 这样的方式,无论任何时候。
- 我设定了encoding为null,获得到的body就是正常的图片数据了。谢谢。
你提到的两个库,公司刚好正在做一个涉及到中文的项目,我会认真学习一下。
谢谢。
@dmoneh 太感谢了,昨天找弄了一晚,现在用你提供的方法好了,感谢大家的分享!!!
我也补一个坑吧,https://github.com/i5ting/testchunks 专门用于测试chunk的
多谢