将 Base64 编码的图像文件从 slackbot 发布到 Slack 通道

a94*_*a94 5 base64 node.js slack-api

此时,在我的代码中,我有一个img包含 Base-64 编码图像的变量。我通过记录输出img并将其粘贴到代码美化 Base-64 图像编码器中来确认 Base-64 图像是正确的。

现在,我正在尝试弄清楚如何 POST 到 Slack API。我已阅读 Slack 的 files.upload 方法 API 文档,其中表示它们接受多部分表单数据或 application/x-www-form-urlencoded,但我不知道如何从 Base-64 转换为其中任何一个节点.js。完成转换后,我也不知道如何使用 request.post 制作实际的帖子,因为我不清楚如何对 slack 请求的相关信息进行编码。

目前,我正在尝试这样的事情:

        request.post({ url: 'https://slack.com/api/files.upload',
          formData: {
            token: slackToken,
            tile: "Image",
            filename: "image.png",
            filetype: "auto",
            channels: "testing",
            file: img,
          },
        }, function (err, response) {
            // just for debugging
            console.log(JSON.parse(response.body));
        });
Run Code Online (Sandbox Code Playgroud)

获取响应: { ok: false, error: 'no_file_data' },这是有道理的,因为 Slack 不接受 base-64 编码img

非常感谢任何帮助!

a94*_*a94 6

首先,我们需要修剪 base64 编码(如果它以以下内容开头):data:image/png;base64,

现在文件系统可以帮助我们转换为文件writeFileSync,它接受文件的base64编码并将文件写入系统。我想找到一种方法来做到这一点,而不会产生将文件写入系统的副作用,但目前还无法做到。

准备就绪后,我们可以使用新创建文件的路径作为参数来发出 slack post 请求file。工作代码如下:

let imgAsBase64 = img.substring(img.indexOf(',') + 1);

require('fs').writeFileSync('image.png', imgAsBase64, 'base64', (err) => {
  console.log(err);
});

await request.post(
  {
    url: 'https://slack.com/api/files.upload',
    formData: {
      token: slackToken,
      tile: 'Image',
      filename: 'image.png',
      filetype: 'auto',
      channels: msg.channel,
      file: require('fs').createReadStream('./image.png')
    }
  },
  function (err, response) {
    // just for debugging
    console.log(response.body);
  }
);
Run Code Online (Sandbox Code Playgroud)