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

但我不断收到错误消息,例如未提供文件或无法打开文件。

感谢任何帮助。

看来您可能有两个问题:

  1. 如果 curl 语句正确,则服务器期望包含要调用的文件的表单字段被称为 files[],而不是您所用的 custom_file在您的 nodejs 示例中。

  2. 您传递的是 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,这被认为是惯用的,并且在较长的 运行.)

您有一些错误:

已编辑:如何从响应写入 zip 文件?

你要写zip文件,请参考压缩包JSZiphttps://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 } } }