Javascript Axios为png图像提供服务时,图像被破坏
我使用express作为中间件api。有人点击我的中间件,它会点击第三方api并返回结果。除了创建png并为其服务的get端点之外,其他所有端点都可以正常工作。 所以在方法下返回响应Javascript Axios为png图像提供服务时,图像被破坏,javascript,es6-promise,axios,ramda.js,Javascript,Es6 Promise,Axios,Ramda.js,我使用express作为中间件api。有人点击我的中间件,它会点击第三方api并返回结果。除了创建png并为其服务的get端点之外,其他所有端点都可以正常工作。 所以在方法下返回响应 _execute = R.curry((reqFunction, req, res) => { reqFunction(req, res). then(r => { res.status(r.status).header(r.headers).s
_execute = R.curry((reqFunction, req, res) => {
reqFunction(req, res).
then(r => {
res.status(r.status).header(r.headers).send(r.data)
}).
catch(err => {
res.status(err.response.status).header(err.headers).send(err.response.data)
})
});
而reqFunction
是类似于
modelDiagram = (req, res) => {
const headers = req.headers;
const modelName = req.params['modelName'];
const endPoint = this.modelDiagramEndPoint + '/' + modelName;
return this.httpRequests.get(endPoint, headers);
}
和httpRequests.get
方法是
get = (endPoint, headers) => {
let options = {
method: 'GET',
url: endPoint
}
options = this.addHeaders(headers, options);
return this._send(options);
}
而这个.\u send就像
_send = (options) => {
return axios(options);
};
如果我直接从浏览器中点击,响应如下
```
�巴布亚新几内亚
IHDRn��7Q�
IDATx���哦����D�ȥ|!H�DD�^)“k”n�̤$H�v뒻�Vж”�+��n——”�[��你只要试试这个
return axios.get(<URL WHICH RETURNS IMAGE IN STRING ex:'http://host/image.png'>, { responseType: 'arraybuffer' })
.then((response) => {
let image = btoa(
new Uint8Array(response.data)
.reduce((data, byte) => data + String.fromCharCode(byte), '')
);
return `data:${response.headers['content-type'].toLowerCase()};base64,${image}`;
});
返回axios.get(,{responseType:'arraybuffer'})
。然后((响应)=>{
让图像=btoa(
新的UINT8阵列(response.data)
.reduce((数据,字节)=>数据+字符串.fromCharCode(字节),“”)
);
返回`data:${response.headers['content-type'].toLowerCase()};base64,${image}`;
});
您可以试试这个
return axios.get(<URL WHICH RETURNS IMAGE IN STRING ex:'http://host/image.png'>, { responseType: 'arraybuffer' })
.then((response) => {
let image = btoa(
new Uint8Array(response.data)
.reduce((data, byte) => data + String.fromCharCode(byte), '')
);
return `data:${response.headers['content-type'].toLowerCase()};base64,${image}`;
});
返回axios.get(,{responseType:'arraybuffer'})
。然后((响应)=>{
让图像=btoa(
新的UINT8阵列(response.data)
.reduce((数据,字节)=>数据+字符串.fromCharCode(字节),“”)
);
返回`data:${response.headers['content-type'].toLowerCase()};base64,${image}`;
});
很抱歉回答得太晚,但也许有人会觉得这种方法更可靠:
axios.get('/path/to/image.png', { responseType: 'arraybuffer' })
.then(response => {
let blob = new Blob(
[response.data],
{ type: response.headers['content-type'] }
)
let image = URL.createObjectURL(blob)
return image
})
我如何理解这一点:
{responseType:'arraybuffer'}
axios将response.data
设置为arraybuffer
url.createObjectURL(blob)
获得blob文件的url,您可以在img
标记的src
属性中使用该urlresponseType中指定:“blob”
,这样您就不需要自己创建blob
对象了:
axios.get('https://picsum.photos/300/300', {responseType: 'blob'})
.then(response => {
let imageNode = document.getElementById('image');
let imgUrl = URL.createObjectURL(response.data)
imageNode.src = imgUrl
})
JSFIDLE
这里是axios关于二进制数据操作缺少文档的介绍。在这里,您可以找到与我建议的相同的方法。您也可以使用
FileReader
API,在stackoverflow comment中,您可以找到这两种方法的优缺点。很抱歉回答得太晚,但可能有人觉得这种方法更可靠:
axios.get('/path/to/image.png', { responseType: 'arraybuffer' })
.then(response => {
let blob = new Blob(
[response.data],
{ type: response.headers['content-type'] }
)
let image = URL.createObjectURL(blob)
return image
})
我如何理解这一点:
{responseType:'arraybuffer'}
axios将response.data
设置为arraybuffer
url.createObjectURL(blob)
获得blob文件的url,您可以在img
标记的src
属性中使用该urlresponseType中指定:“blob”
,这样您就不需要自己创建blob
对象了:
axios.get('https://picsum.photos/300/300', {responseType: 'blob'})
.then(response => {
let imageNode = document.getElementById('image');
let imgUrl = URL.createObjectURL(response.data)
imageNode.src = imgUrl
})
JSFIDLE
这里是关于axios缺少二进制数据操作的文档。在这里,您可以找到我建议的相同方法。您也可以使用
FileReader
API,在stackoverflow comment中,您可以找到这两种方法的优缺点。您是否尝试过在axios选项中配置内容类型?默认情况下,预期的内容是nt类型是JSON。我猜对于二进制文件,您必须使用blob或stream@PatrickHund我尝试过,我建议将图像转换为Base64字符串,然后发送它们。我有很好的使用经验。每个浏览器都可以毫无问题地呈现它们。好的,我将尝试@Hosseinaghaha您是否尝试过在a中配置内容类型xios选项?默认情况下,预期的内容类型是JSON。我猜对于二进制文件,您必须使用blob或stream@PatrickHund我尝试过,我建议将图像转换为Base64字符串,然后发送它们。我有很好的使用经验。每个浏览器都可以毫无问题地渲染它们。好的,我将尝试@HosseinAgha