Node.js - Axios - 将文件上传到另一个服务器

3
我需要使用axios从一个Node.js服务器上传文件到另一个服务器。我正在使用multer来处理从客户端接收到的数据。以下是我的代码:
const multer = require('multer');
const router = require('express').Router();
const FormData = require('form-data');
const fs = require('fs');

router.post('/profile/:idProfile/post', upload.any(), (req, res) => {
  const file = req.files[0];
  const url = 'https://graph.facebook.com/' + req.params.idProfile + '/photos?access_token=<my-access-token>';
  const fd = new FormData();
  const config = {
    headers: { 'Content-Type': 'multipart/form-data' }
  };

  fd.append('file', fs.createReadStream(file.path), file.path);

  axios.post(url, fd, config)
    .then((res2) => {
      res.send(res2);
    })
    .catch((err) => {
      res.send({
        code: err.response.status,
        error: err.response.data.error
      });
    });
});

我并没有发现任何问题,但是我仍然从Facebook的图形API中收到以下错误信息:

{
  "code": 400,
  "error": {
    "message": "(#324) Requires upload file",
    "type": "OAuthException",
    "code": 324,
    "fbtrace_id": "HeA2joMhLQ7"
  }
}

我已经尝试从一个简单的HTML页面直接上传文件到Facebook Graph API URL并获得了成功。但我不明白在这里缺少什么。

问题有点误导性...实际上你只想将照片上传到Facebook,它不存在于Web服务器上,而是随表单输入一起提交。这可能会对你有所帮助:https://www.devils-heaven.com/facebook-javascript-sdk-photo-upload-with-formdata/ - andyrandy
顺便问一句,这是针对Facebook用户个人资料还是页面的? - andyrandy
@luschn页面。这与我之前的问题https://stackoverflow.com/questions/51466732/node-js-send-file-to-facebook-graph-api?noredirect=1#comment89913797_51466732有关。 - Raphael
那么这个问题和另一个问题有什么不同呢?你只是使用了axios而不是其他sdk,但是它与完全相同的错误是一样的。你试过我文章中的代码吗?我也在另一个线程中发布了它。 - andyrandy
@luschn 是的,我尝试了这段代码。但是最终我在这里找到了解决方案 https://github.com/axios/axios/issues/318 - Raphael
2个回答

1
我找到了解决问题的方法。我需要使用fd.pipe()和concat将图像以二进制格式发送给axios:
fd.pipe(concat({ encoding: 'buffer' }, (data) => {
  axios.post(url, data, { headers: fd.getHeaders() });
}));

这个问题的更多细节在这里


你真是个救命恩人。我花了整整一天的时间来解决这个问题。 - cadenzah

0
//Concat the formData.
const concatenated = await new Promise((resolve, reject) => {
    formData.pipe(concat({ encoding: 'buffer' }, async (data) => {
        resolve(data);
    }))
})

//Now you can use it.
const resp = await axios.post(
    `${URL_BASE}/upload_file`,
    concatenated,
    {
        headers: {...formData.getHeaders()}
    }
);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接