问题描述
我尝试使用 node 将文件上传到 redmine,我可以上传和附加文本文件,但是当我尝试上传二进制文件时,我获得了令牌,但该文件不起作用.我尝试了 json、xml 和二进制、ascii、base64 编码.
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.
我正在使用 node-rest-client 进行服务调用
I'm using node-rest-client for service calling
有人能给我任何建议来解决这个问题吗?
Could someone give me any suggestion to fix this problem?
谢谢,
我定义了类 RMClient
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;
};
选项 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;
我用来上传文件的代码:
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);
}
推荐答案
我遇到了同样的问题并通过以下方式解决了:
I faced the same issue and solved it this way:
- 使用multer";
- 上传文件后,使用节点请求"模块发出请求,将
req.file.buffer
作为body
.
这篇关于使用节点上传二进制文件到 redmine的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!