4

I'm trying to upload image file to Rest server(Confluence to be more specific) using Restify module but getting Assertion error. I'm not sure if I'm using right approach for file upload to REST server. Could anyone point me to the right direction?

This is my attempt -

var restify = require('restify');
var header = {'Authorization': 'Basic xxxxx', 'content-type': 'multipart/form-data'};
var client = restify.createJsonClient({
   url: 'http://www.testsite.com',
   version: '*',
   headers: header
});
var image = "c:\\Users\\abc\\Documents\\bbb.jpg";           
var fileStream = fs.createReadStream(image);
var stat = fs.statSync(image);
var size = stat["size"];
var param = "?pageId=123&filename=mynewimage&mimeType=image%2Fjpeg&size=" + size;       
fileStream.pipe(
    client.post("/plugins/drag-and-drop/upload.action"+param, function(err, req, res, obj) {
        if (err) {
            return err;
        }

    })
);  

UPDATE:

This is an assertion error I'm getting assert.js:86

throw new assert.AssertionError({
        ^
AssertionError: body
    at Object.module.exports.(anonymous function) [as ok] (c:\Users\abc\myproj\node_modules\restify\node_modules\assert-pl
us\assert.js:242:35)
    at JsonClient.write (c:\Users\abc\myproj\node_modules\restify\lib\clients\json_client.js:31:12)
    at ReadStream.ondata (_stream_readable.js:540:20)
    at ReadStream.emit (events.js:107:17)
    at readableAddChunk (_stream_readable.js:163:16)
    at ReadStream.Readable.push (_stream_readable.js:126:10)
    at onread (fs.js:1683:12)
    at FSReqWrap.wrapper [as oncomplete] (fs.js:529:17)
mscdex
  • 104,356
  • 15
  • 192
  • 153
KMC
  • 1,677
  • 3
  • 26
  • 55
  • You might include the actual assertion error you're seeing. – mscdex May 25 '15 at 21:08
  • `createJsonClient()` is for sending JSON data, not binary (image) data. Restify has no method for *sending* `multipart/form-data` requests, only raw, `application/x-www-form-urlencoded`, and `application/json`. What `Content-Type` is your destination server expecting? – mscdex May 26 '15 at 13:57
  • For that route, it's expecting multipart/form-data. What module would your recommend for that purpose? My code is just to upload data to remote server and I don't need to implement user interface at all. I prefer something light weight. – KMC May 26 '15 at 14:04

2 Answers2

3

I was struggling both sending a request containing multipart/form-data and processing this request on an API using restify 5. Following @mscdex answer I came up with the following code that handles both scenarios:

"use strict"

const restify  = require('restify'),
  plugins  = require('restify-plugins'),
  fs       = require('fs'),
  request  = require('request'),
  FormData = require('form-data');

var server = restify.createServer();
server.use(plugins.multipartBodyParser());  // Enabling multipart

// Adding route
server.post('/upload', (req, res, next) =>{
    /**
    * Processing request containing multipart/form-data
    */
    var uploaded_file = req.files.mySubmittedFile;  // File in form

    //Reading and sending file
    fs.readFile(uploaded_file.path, {encoding: 'utf-8'}, (err, data)=>{
        // Returning a JSON containing the file's name and its content
        res.send({
            filename: uploaded_file.name,
            content: data
        });
        next()
    });
});

// Launching server at http://localhost:8080
server.listen(8080, start);

// Client request
function start(){
    // Making a request to our API using form-data library
    // Post file using multipart/form-data
    var formData = {
        mySubmittedFile: fs.createReadStream('/tmp/hello.txt')
    }
    request.post({'url': 'http://localhost:8080/upload', formData: formData}, function(err, res, body){
        console.log("Response's body is: "+ body);
    });
}

Using:

  • form-data@2.2.0
  • request@2.81.0
  • restify@5.0.1
  • restify-plugins@1.6.0
  • node @6.11.1

I tried not using the libraries form-data and request to only use restify/http but I ended up with a horrible long code.

educalleja
  • 173
  • 3
  • 11
1

To send multipart/form-data, you will have to use a library other than restify because it doesn't support that Content-Type.

You could use request which does have support for multipart/form-data http requests built-in.

mscdex
  • 104,356
  • 15
  • 192
  • 153