我正在尝试将以下curl转换为节点请求。
curl -F files[]=@database.mdb 'https://www.rebasedata.com/api/v1/convert?outputFormat=mysql&errorResponse=zip' -o output.zip
我尝试使用request或node-libcurl,但是找不到上载mdb文件的方法。
我的代码是
var request = require('request');
var options = {
url: 'https://www.rebasedata.com/api/v1/convert?outputFormat=mysql&errorResponse=zip',
method: 'POST',
formData: {
custom_file: {
options: {
contentType: 'application/mdb'
},
value: path.resolve(__dirname, 'myMdb.mdb')
}
}
};
function callback(error, response, body) {
if (!error && response.statusCode == 200) {
console.log(body);
}
}
request(options, callback);
但是我不断收到错误消息,例如未提供文件或无法打开文件。
感谢您的帮助。
答案 0 :(得分:1)
您有一些错误:
key
的{{1}}是curl
,而不是files[]
,这里仅是https://github.com/request/request#multipartform-data-multipart-form-uploads的custom_file
文档的一个示例。因此,请将其更改为request
files[]
的文档还说,该值应为request
,而不是路径stream
和path
来创建流并读取路径文件已修改:如何从响应中写入zip文件?
您要编写zip文件,请参考软件包fs
https://stuk.github.io/jszip/documentation/howto/read_zip.html。拥有JSZip
之后,阅读zip并写入zip文件。
我已经用新代码解决了您的问题,回调处理程序来自body
的文档,您可以忽略我的回调处理程序。
更新的zip文件
在安装软件包request
jszip
这是代码,请在请求时添加编码:null :
npm install jszip --save
我的文件var request = require('request');
var path = require('path');
var fs = require('fs');
var JSZip = require("jszip");
function callback(error, response, body) {
if (error || response.statusCode !== 200) {
console.log(error);
return;
}
JSZip.loadAsync(body).then(zip => {
console.log(zip.files);
zip.generateNodeStream({ type: 'nodebuffer', streamFiles: true })
.pipe(fs.createWriteStream(path.join(__dirname, './out.zip')))
.on('finish', function () {
console.log("File written");
});
}).catch(err => console.log(err))
}
request({
url: 'https://www.rebasedata.com/api/v1/convert?outputFormat=mysql&errorResponse=zip',
method: 'POST',
encoding: null, // <--------- important ----------
formData: {
'files[]': {
options: {
filename: 'database.mdb',
contentType: 'application/mdb'
},
value: fs.createReadStream(path.resolve(__dirname, './database.mdb'))
}
}
}, callback);
在此处https://ufile.io/prnsi上载(文件将在发布答案后30天之内删除)。
当database.mdb
时,您将从我的数据库文件中收到
console.log(zip.files);
答案 1 :(得分:0)
您似乎有两个问题:
如果curl
语句正确,则服务器期望包含文件的表单字段称为files[]
,而不是您的nodejs示例中的custom_file
您正在传递 string (文件名),而不是 stream (文件内容)。
尝试这样的事情:
var request = require('request');
var options = {
url: 'https://www.rebasedata.com/api/v1/convert?outputFormat=mysql&errorResponse=zip',
method: 'POST',
formData: {
'files[]': {
options: {
contentType: 'application/mdb'
},
value: fs.createReadStream(path.resolve(__dirname, 'myMdb.mdb'))
}
}
};
function callback(error, response, body) {
if (!error && response.statusCode == 200) {
console.log(body);
}
}
request(options, callback);
(我也考虑过https://github.com/request/request-promise;它具有相同的请求格式,但是您可以放弃回调并使用promise,这被认为是惯用的,从长远来看会更容易。)