如何通过 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
  }
}