将 curl 上传文件转换为 Node.JS 中的请求并写入 zip 文件
Convert curl upload files to request in Node.JS and write zip file
我正在尝试将以下 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);
但我不断收到错误消息,例如未提供文件或无法打开文件。
感谢任何帮助。
看来您可能有两个问题:
如果 curl
语句正确,则服务器期望包含要调用的文件的表单字段被称为 files[]
,而不是您所用的 custom_file
在您的 nodejs 示例中。
您传递的是 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;它具有相同的请求格式,但您可以放弃回调并改用 promises,这被认为是惯用的,并且在较长的 运行.)
您有一些错误:
curl
语句的key
是files[]
,不是custom_file
,这里只是request
文档的一个例子https://github.com/request/request#multipartform-data-multipart-form-uploads .所以请将其更改为 files[]
request
的文档也说该值应该是stream
,而不是路径
- 您应该要求
path
和 fs
来创建流和读取路径文件
已编辑:如何从响应写入 zip 文件?
你要写zip文件,请参考压缩包JSZip
https://stuk.github.io/jszip/documentation/howto/read_zip.html。拥有 body
后,读取 zip 并写入 zip 文件。
我已经用新代码解决了你的问题,回调处理程序来自request
的文档,你可以忽略我的回调处理程序。
已更新 zip 文件
安装前请先安装包jszip
npm install jszip --save
这是代码,请在请求时添加encoding: null:
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);
我的文件 database.mdb
上传到这里 https://ufile.io/prnsi(文件将在答案发布 30 天后删除)。
当 console.log(zip.files);
时,您将从我的数据库文件中收到
{ 'data.sql':
{ name: 'data.sql',
dir: false,
date: 2018-12-17T02:09:08.000Z,
comment: null,
unixPermissions: 33206,
dosPermissions: null,
_data:
{ compressedSize: 643,
uncompressedSize: 1817,
crc32: 1832401262,
compression: [Object],
compressedContent: <Buffer 9d 54 6d 6f a2 40 10 fe 7c fc 8a b9 4f da 56 da c5 7a 46 bd 98 88 b0 b6 44 5c ae 80 f7 d2 2f 88 b0 6d 49 10 1a 5e 9a f6 df df 02 be 80 40 7a 39 02 c9 ... > },
_dataBinary: true,
options: { compression: null, compressionOptions: null } } }
我正在尝试将以下 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);
但我不断收到错误消息,例如未提供文件或无法打开文件。
感谢任何帮助。
看来您可能有两个问题:
如果
curl
语句正确,则服务器期望包含要调用的文件的表单字段被称为files[]
,而不是您所用的custom_file
在您的 nodejs 示例中。您传递的是 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;它具有相同的请求格式,但您可以放弃回调并改用 promises,这被认为是惯用的,并且在较长的 运行.)
您有一些错误:
curl
语句的key
是files[]
,不是custom_file
,这里只是request
文档的一个例子https://github.com/request/request#multipartform-data-multipart-form-uploads .所以请将其更改为files[]
request
的文档也说该值应该是stream
,而不是路径- 您应该要求
path
和fs
来创建流和读取路径文件
已编辑:如何从响应写入 zip 文件?
你要写zip文件,请参考压缩包JSZip
https://stuk.github.io/jszip/documentation/howto/read_zip.html。拥有 body
后,读取 zip 并写入 zip 文件。
我已经用新代码解决了你的问题,回调处理程序来自request
的文档,你可以忽略我的回调处理程序。
已更新 zip 文件
安装前请先安装包jszip
npm install jszip --save
这是代码,请在请求时添加encoding: null:
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);
我的文件 database.mdb
上传到这里 https://ufile.io/prnsi(文件将在答案发布 30 天后删除)。
当 console.log(zip.files);
时,您将从我的数据库文件中收到
{ 'data.sql':
{ name: 'data.sql',
dir: false,
date: 2018-12-17T02:09:08.000Z,
comment: null,
unixPermissions: 33206,
dosPermissions: null,
_data:
{ compressedSize: 643,
uncompressedSize: 1817,
crc32: 1832401262,
compression: [Object],
compressedContent: <Buffer 9d 54 6d 6f a2 40 10 fe 7c fc 8a b9 4f da 56 da c5 7a 46 bd 98 88 b0 b6 44 5c ae 80 f7 d2 2f 88 b0 6d 49 10 1a 5e 9a f6 df df 02 be 80 40 7a 39 02 c9 ... > },
_dataBinary: true,
options: { compression: null, compressionOptions: null } } }