node.js - 使用node上传二进制文件到redmine

标签 node.js rest redmine

我尝试使用 Node 将文件上传到redmine,我可以上传并附加文本文件,但是当我尝试上传二进制文件时,我得到了 token ,但文件不起作用。我尝试过 json、xml 和二进制、ascii、base64 编码。

我想上传二进制文件,因为我正在进行端到端测试,我想用屏幕截图打开问题,并上传报告。

我正在使用node-rest-client进行服务调用

有人可以给我任何建议来解决这个问题吗?

谢谢

我定义了 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;
};

选项 1:

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

选项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;

我用来上传文件的代码:

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

最佳答案

我遇到了同样的问题并通过以下方式解决了:

  • 使用“multer”;
  • 当您上传文件时,使用 Node “request”模块发出请求,并将 req.file.buffer 作为 body

关于node.js - 使用node上传二进制文件到redmine,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33647309/

相关文章:

android - 如何配置/platforms/android/assets下的 "file.list"走正确的路径?

node.js - Openshift:如何在 node.js 应用程序中隐藏服务器 js 文件?

Spring 数据休息 : Override Method in RestController with same request-mapping-path

redmine - 在 redmine 中接收 imap 电子邮件的问题

node.js - Jenkins 使用旧 Node 版本构建项目

node.js - i18Next - NodeJS - 如何在不重新加载服务器的情况下更改翻译

rest - 使用 Rest API 调用 (HTTP-GET) 从 Google Firestore 获取特定数据

python - 使用 OFFSET 在 Python 中迭代 JSON

ruby - 运行 Redis 作为 Redmine 的外部缓存服务器

tomcat - 莺 - 没有这样的文件加载错误