2016-06-28 3 views
4

EDITEDнатяжной API (files.upload) с помощью NodeJS

Я пытаюсь структурировать files.upload() API обеспеченные через Слэк но я с трудом понять правильный формат. На данный момент я могу использовать API для загрузки текстового файла, но не могу на всю жизнь выяснить, как загрузить изображение.

Вот моя проблема: у меня есть изображение на моем сервере разработки, назовем его image.png. Я хочу использовать API files.upload(), чтобы отправить это изображение в канал #general Slack. Ниже приведен код, который я, который успешно генерации изображения, но в настоящее время только для передачи текста:

 var myBarChart = new Chart(ctx).Bar(barChartData, barChartOptions); 
     var myBarChartDataURL = leaderboardBarChart.toBase64Image(); 

     canvas.toBuffer(function(err, buf) { 
      if (err) throw err; 
      fs.writeFile(__dirname + "/leaderboard.png", buf); 
     }); 

     bot.api.files.upload({ 
      token: process.env.token, 
      title: "Image", 
      filename: "image.png", 
      filetype: "auto", 
      //content: "Posted with files.upload API", 
      file: fs.createReadStream("path/to/image_file.png"), 
      channels: filtered[0].id 
     }, function(err, response) { 
      if (err) { 
      console.log("Error (files.upload) " + err); 
      } else { 
      console.log("Success (files.upload) " + response); 
      }; 
     }); 

Когда я запускаю код, я получаю один из следующих ошибок:

«invalid_array_arg», который натяжные details as: "Метод передан аргумент массива PHP-типа (например, с именем, подобным foo [7]). Это никогда не действует с помощью Slack API."

Я не совсем уверен, что делать с этой ошибкой, поскольку я не использую PHP, ни что-нибудь, что я могу определить, что будет похоже на PHP.

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

Я понимаю, что этот конкретный API использует multipart/form-data, но у меня нет формы. Это приложение - это приложение NodeJS. Нет рамки (например, Express), работающей в тандеме с главным скриптом узла.

Любая помощь действительно ценится. Опять же, просто ищем информацию о том, что мне не хватает или что-то не так.

Заранее благодарен!

+0

Не мог бы вы рассказать нам, что 'bot.api' это? Я просто догадываюсь, основываясь на именах переменных, но, возможно, вы используете [botkit] (https://github.com/howdyai/botkit)? – smarx

+1

Если это действительно botkit, я думаю, что 'file: fs.createReadStream (" путь/to/image/file ")' может сделать трюк. (Botkit использует [request] (https://github.com/request/request), который обрабатывает 'multipart/form-data' через [form-data] (https://github.com/form-data/form- данные)). – smarx

+0

Я использую botkit! Я попробую это, спасибо за предложение! – dannyk

ответ

7

Похоже, вам придётся выйти за пределы API Боткита, так как Боткит, похоже, не поддерживает отправку multipart/form-data.

Дайте это попробовать, используя request непосредственно (уже используется сам Botkit):

var request = require('request'); 

... 

request.post({ 
    url: 'https://slack.com/api/files.upload', 
    formData: { 
     token: bot.config.token, 
     title: "Image", 
     filename: "image.png", 
     filetype: "auto", 
     channels: filtered[0].id, 
     file: fs.createReadStream('test.png'), 
    }, 
}, function (err, response) { 
    console.log(JSON.parse(response.body)); 
}); 
+0

Я не могу поблагодарить вас за вашу помощь. Ваш предложенный ответ работал безупречно. Большое вам спасибо, я очень благодарен! – dannyk

+0

Можно ли отправлять напрямую пользователю, а не по каналу? Я вижу, что документы только говорят о посылке на канал – dimirc

+0

FYI ... Я только что получил исходный запрос (используя bot.api.files.upload) для работы. Похоже, что в Botkit v0.4.1 есть исправление. См. Https://github.com/howdyai/botkit/commit/2bde51ff5326ccc44b8764ecc3110dac6696ef6c для получения более подробной информации –

-1

Я рекомендую Вам использовать nodejslack. Используется шаблон Promises, приведенный в действие Bluebird. Существует пример код для загрузки файла в его документациях, вот оно:

var Slack = require('nodejslack'); 
    var fs = require('fs'); 
    var SLACK_TOKEN = process.env.SLACK_TOKEN || 'YOUR_GENERATED_SLACK_TOKEN'; 

    var slack = new Slack(SLACK_TOKEN); 

    var form = { 
     file: fs.createReadStream('test.csv'), // Optional, via multipart/form-data. If omitting this parameter, you MUST submit content 
     // content: 'Your text here', // Optional, File contents. If omitting this parameter, you must provide a `file` 
     filename: 'test.csv', // Required 
     fileType: 'post', // Optional, See more file types in https://api.slack.com/types/file#file_types 
     title: 'Title of your file!', // Optional 
     initial_comment: 'First comment about this file.', // Optional 
     channels: 'general' //Optional, If you want to put more than one channel, separate using comma, example: 'general,random' 
    }; 

    slack.fileUpload(form) 
    .then(function(response){ 

     // Slack sends a json with a boolean var ok. 
     // Error example : data = { ok: false, error: 'user_not_found'   } 
     // Error example : data = { ok: true, file: 'user_not_found' } 
     if(!response || !response.ok){ 
      return Promise.reject(new Error('Something wrong happened during the upload.')); 
     } 
     console.log('Uploaded Successfully:',response); 

     return Promise.resolve(response); 
    }) 
    .catch(function(err){ 
     return err; 
    });