如何通过 post 将图像二进制文件发送到 API?节点
how can I send an image binary via post to an API? nodejs
我得到的二进制图像是这样的:
axios.get("image-url.jpg")
我需要使用响应向另一台服务器发出新的 POST 请求
const form = new FormData();
const url = "post-url-here.com";
form.append(
"file",
new ReadableStream(Buffer.from(file)),
"image-test.jpg"
);
const config = {
headers: {
...form.getHeaders(),
Authorization:
"Bearer token-here",
},
};
axios.post(url, form, config);
不幸的是,这不起作用。我得到的回复是:
data: {
message: 'This file is not compatible with the picture engine, please try another one',
error: 'bad_request',
status: 400,
cause: []
}
我怎样才能正确地做到这一点?
编辑:
form.getheaders 正在将此标头添加到请求中:
'content-type': 'multipart/form-data; boundary=--------------------------783115116498484087556627'
全部请求headers:
headers: {
Accept: 'application/json, text/plain, */*',
'Content-Type': 'multipart/form-data; boundary=--------------------------918731250556909112992344',
Authorization: 'Bearer token-here',
'User-Agent': 'axios/0.21.1'
},
全部请求信息:
_header: 'POST /pictures/items/upload HTTP/1.1\r\n' +
'Accept: application/json, text/plain, */*\r\n' +
'Content-Type: multipart/form-data; boundary=--------------------------116660171215340291632150\r\n' +
'Authorization: Bearer token-here\r\n' +
'User-Agent: axios/0.21.1\r\n' +
'Host: api.mercadolibre.com\r\n' +
'Connection: close\r\n' +
'Transfer-Encoding: chunked\r\n' +
'\r\n',
POST的例子Header:
POST /video-upload/ HTTP/1.1
Host: your host
User-Agent: axios/0.21.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: it-IT,it;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Content-Type: multipart/form-data; boundary=---------------------------219493771727403213993181042749
Content-Length: 99211703
Connection: keep-alive
如您所见,有一些重要的部分,例如:
POST /the-url/ HTTP/1.1
Host: your host
Content-Length: the length in bytes of your image
Content-Type: multipart/form-data; boundary=---------------------------219493771727403213993181042749
Connection: keep-alive
所以您的脚本不读取图像,您的 header 已损坏,如服务器的 status:400 响应所述。
试试这个(伪代码):
const axios = require('axios');
const fs = require('fs');
var im_config = {
responseType: 'stream'
};
let im_url = 'image-url' ;
async function getImage() {
let resp = await axios.get(im_url, im_config);
//save the image
resp.data.pipe(fs.createWriteStream('test-image.jpg'));
}
getImage().then(function(result){
console.log(result);
const form = new FormData();
const url = "server url where send the form ";
// interesting part
form.append('image', 'test-image.jpg');
axios.post(url, form, your-config);
});
成功了!好的
要即时执行此操作,请尝试在不保存图像的情况下从 'result' 或 'resp' 获取对下载图像的引用。
否则在 POST 完成后取消链接下载的图像。
fs.unlink('test-image.jpg', (err) => {
if (err) {
console.error(err)
return
}
}
我得到的二进制图像是这样的:
axios.get("image-url.jpg")
我需要使用响应向另一台服务器发出新的 POST 请求
const form = new FormData();
const url = "post-url-here.com";
form.append(
"file",
new ReadableStream(Buffer.from(file)),
"image-test.jpg"
);
const config = {
headers: {
...form.getHeaders(),
Authorization:
"Bearer token-here",
},
};
axios.post(url, form, config);
不幸的是,这不起作用。我得到的回复是:
data: {
message: 'This file is not compatible with the picture engine, please try another one',
error: 'bad_request',
status: 400,
cause: []
}
我怎样才能正确地做到这一点?
编辑: form.getheaders 正在将此标头添加到请求中:
'content-type': 'multipart/form-data; boundary=--------------------------783115116498484087556627'
全部请求headers:
headers: {
Accept: 'application/json, text/plain, */*',
'Content-Type': 'multipart/form-data; boundary=--------------------------918731250556909112992344',
Authorization: 'Bearer token-here',
'User-Agent': 'axios/0.21.1'
},
全部请求信息:
_header: 'POST /pictures/items/upload HTTP/1.1\r\n' +
'Accept: application/json, text/plain, */*\r\n' +
'Content-Type: multipart/form-data; boundary=--------------------------116660171215340291632150\r\n' +
'Authorization: Bearer token-here\r\n' +
'User-Agent: axios/0.21.1\r\n' +
'Host: api.mercadolibre.com\r\n' +
'Connection: close\r\n' +
'Transfer-Encoding: chunked\r\n' +
'\r\n',
POST的例子Header:
POST /video-upload/ HTTP/1.1
Host: your host
User-Agent: axios/0.21.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: it-IT,it;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Content-Type: multipart/form-data; boundary=---------------------------219493771727403213993181042749
Content-Length: 99211703
Connection: keep-alive
如您所见,有一些重要的部分,例如:
POST /the-url/ HTTP/1.1
Host: your host
Content-Length: the length in bytes of your image
Content-Type: multipart/form-data; boundary=---------------------------219493771727403213993181042749
Connection: keep-alive
所以您的脚本不读取图像,您的 header 已损坏,如服务器的 status:400 响应所述。
试试这个(伪代码):
const axios = require('axios');
const fs = require('fs');
var im_config = {
responseType: 'stream'
};
let im_url = 'image-url' ;
async function getImage() {
let resp = await axios.get(im_url, im_config);
//save the image
resp.data.pipe(fs.createWriteStream('test-image.jpg'));
}
getImage().then(function(result){
console.log(result);
const form = new FormData();
const url = "server url where send the form ";
// interesting part
form.append('image', 'test-image.jpg');
axios.post(url, form, your-config);
});
成功了!好的
要即时执行此操作,请尝试在不保存图像的情况下从 'result' 或 'resp' 获取对下载图像的引用。
否则在 POST 完成后取消链接下载的图像。
fs.unlink('test-image.jpg', (err) => {
if (err) {
console.error(err)
return
}
}