ExpressJS返回图片响应为空:使用request-promise的问题求助
解决ExpressJS结合request-promise返回图片为空的问题
你遇到的这个问题其实挺常见的——用request-promise拉取图片二进制数据,明明状态码、响应头都显示正常,但就是返回空内容,浏览器完全不认。核心原因在于request-promise默认会把响应体解析成UTF-8字符串,而图片是二进制数据,字符串编码会直接破坏原始的二进制结构,导致发送给客户端的内容已经不是有效的图片数据了。
下面给你两种靠谱的解决方案:
方案一:让request返回原始二进制Buffer
只需要在request的配置里加上encoding: null,这样它就不会对响应体做字符串编码处理,直接返回原始的Buffer对象,这时候再发送给客户端就没问题了:
function exportImage(req, res) { request({ url: myUrl, encoding: null // 关键:禁用自动字符串编码,保留二进制Buffer }) .then(data => { res.contentType("image/png"); res.send(data); }) .catch(err => { // 别忘了处理错误,比如远程服务挂了的情况 res.status(500).send('图片下载失败,请稍后重试'); }); }
方案二:用流的方式直接转发(更高效)
如果图片比较大,用Buffer可能会占用过多内存,这时候直接用流的方式把远程响应pipe给客户端响应会更高效,而且代码更简洁:
function exportImage(req, res) { res.contentType("image/png"); // 直接将远程请求的响应流转发给客户端 request(myUrl).pipe(res) .on('error', err => { res.status(500).send('图片转发失败'); }); }
这种方式不需要等待整个图片下载完成,而是边下载边返回给客户端,性能更好,也避免了内存溢出的风险。
最后提醒一下:要确保远程服务返回的确实是PNG格式的图片,如果是JPG或者其他格式,记得把res.contentType改成对应的类型(比如image/jpeg)哦!
内容的提问来源于stack exchange,提问作者Robert Strauch
相关产品推荐
相关产品推荐

