Отправка файла изображения в кодировке Base64 на канал Slack из slackbot - PullRequest
1 голос
/ 28 апреля 2019

На данный момент в моем коде у меня есть переменная img, которая содержит изображение в кодировке base-64.Я подтвердил правильность образа base-64, зарегистрировав img и вставив вывод в код, чтобы украсить кодировщик изображений base-64.

Теперь я пытаюсь выяснить, как выполнить POST дляSlack API.Я прочитал документацию по API метода files.upload для Slack, в которой говорится, что они принимают многочастные данные формы или application / x-www-form-urlencoded, но я не знаю, как преобразовать Base-64 в любой изNode.js.После того, как я выполнил преобразование, я также не знаю, как создать реальное сообщение с использованием request.post, так как мне неясно, как кодировать соответствующую информацию для слабого запроса.

В настоящее время яЯ пытаюсь что-то вроде этого:

        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));
        });

Получение ответа: { ok: false, error: 'no_file_data' }, что имеет смысл, поскольку Slack не принимает кодировку base-64 img

Любая помощь высоко ценится!

1 Ответ

0 голосов
/ 29 апреля 2019

Сначала нам нужно обрезать кодировку base64, если она начинается с: data:image/png;base64,

Теперь файловая система может помочь нам с преобразованием в файл с помощью writeFileSync, который принимает кодировку base64 файла и записывает файл в систему. Я хотел бы найти способ сделать это без побочного эффекта записи файла в систему, но пока не смог.

Как только все будет готово, мы можем сделать наш слабый пост-запрос с путем к пути к вновь созданному файлу в качестве параметра 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);
      })};
...