【问题标题】:Node.js - Axios - Upload file to another serverNode.js - Axios - 将文件上传到另一台服务器
【发布时间】:2020-12-22 02:54:57
【问题描述】:

我需要使用 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 的 Graph API 收到以下错误:

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

我已经尝试将文件从一个简单的 html 页面直接上传到 Facebook Graph Api url 并成功。但我无法理解这里缺少什么

【问题讨论】:

  • 这个问题有点误导...您实际上只是想将照片上传到 facebook,它不存在于网络服务器上,但带有表单输入。这可以帮助你:devils-heaven.com/…
  • 顺便说一句,这是用于 Facebook 上的用户个人资料或页面吗?
  • @luschn 页面。这和我之前的问题stackoverflow.com/questions/51466732/…有关
  • 那么与另一个问题有什么区别呢?您只是使用 axios 而不是其他一些 sdk,但它是完全相同的东西,具有完全相同的错误。你试过我文章中的代码了吗?我也确实在另一个线程中发布了它。
  • @luschn 是的,我尝试了代码。但是,我终于在这里找到了解决方案github.com/axios/axios/issues/318

标签: node.js facebook-graph-api file-upload axios multer


【解决方案1】:

我找到了解决问题的方法。我需要使用 fd.pipe() 和 concat 来使用 axios 发送图像,因为它是二进制格式:

fd.pipe(concat({ encoding: 'buffer' }, (data) => {
  axios.post(url, data, { headers: fd.getHeaders() });
}));

There's more details on this issue here

【讨论】:

  • 你真是个救命恩人。我花了一整天的时间弄清楚这件事。
【解决方案2】:
//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()}
    }
);

【讨论】:

    猜你喜欢
    • 2011-11-05
    • 1970-01-01
    • 2018-01-12
    • 2018-05-17
    • 1970-01-01
    • 1970-01-01
    • 2017-01-23
    • 2011-12-03
    • 1970-01-01
    相关资源
    最近更新 更多