upload binary file to redmine with node

a 夏天 提交于 2020-01-02 16:52:25

问题


I try to upload a file to redmine with node, I can upload and attach text files, but when I try to upload a binary file I get the token but the file doesn't work. I tried with json, xml and binary, ascii, base64 encoding.

I want upload binary files because I'm doing end to end test testing I want open Issues with screenshots, and upload a report.

I'm using node-rest-client for service calling

Could someone give me any suggestion to fix this problem?

Thanks,

I define the class RMClient

var Client = require('node-rest-client').Client;
var Q = require('q');
var RMClient = function(baseUri, apiToken){
        this._apiToken = apiToken;
        var client = new Client();
        client.registerMethod('openIssue', baseUri+'/issues.json', 'POST');
        client.registerMethod('uploadFile', baseUri+'/uploads.json', 'POST');
        client.registerMethod('getIssues', baseUri+'/issues.json', 'GET');
        this._client = client;
};

option 1:

var deferred = Q.defer();
var file fs.readFileSync(filePath);
//code for sending file to redmine uploads.json 
return deferred.promise;

Option 2

var deferred = Q.defer();
var rs = fs.createReadStream(filePath, {'flags': 'r', 'encoding': null, 'autoClose': true});
var size = fs.statSync(filePath).size;
var file = '';
rs.on('error', function(err){ 
  deferred.reject(err);
});
rs.on('data', function(chunk){ file += chunk; });
rs.on('end', function(){
 //code for sending file to redmine uploads.json 
});
return deferred.promise;

Code that I use to upload the file:

try{
    if(!file){
        throw new Error('File must\'nt be void');
    }
    var rmc = new RMClient(myRMURI, myAPItoken);
    var headers = {
        'X-Redmine-API-Key': rmc._apiToken,
        'Content-Type': 'application/octet-stream',
        'Accept':'application/json',
        'Content-Length': size
    };

    var args = {
        'data':file,
        'headers': headers
    };
    if(parameters){
        args.parameters = parameters;
    }

    rmc._client.methods.uploadFile(args, function(data, response){
        if(response.statusCode != 201){
            var err = new Error(response.statusMessage);
            deferred.reject(err);
            return;
        }

        var attach = JSON.parse(data);
        console.log(attach);
        if(data.errors){
            var msg = ''.concat.apply('', attach.errors.map(function(item, i){
                return ''.concat(i+1,'- ',item,(i+1<attach.errors.length)?'\n':'');
            }));
            console.error(msg);
            deferred.reject(Error(msg));
        }else{
            deferred.resolve(attach.upload.token);
        }
    });
}catch(err){
    console.error(err);
    deferred.reject(err);
}

回答1:


Then uploading files using the Rest API, you have to send the raw file contents in the request body, typically with Content-Type: application/octet-stream. The uploaded file doesn't need any further encoding or wrapping, esp. not as multipart/form-data, JSON or XML.

The response of the POST request to /uploads.xml contains the token to attach the attachment to other objects in Redmine.




回答2:


I faced the same issue and solved it this way:

  • Use "multer";
  • When you have an uploaded file, make a request using node "request" module, with req.file.buffer as body.


来源:https://stackoverflow.com/questions/33647309/upload-binary-file-to-redmine-with-node

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!