将curl上传文件转换为在Node.JS中进行请求并写入zip文件

时间:2018-12-16 23:49:02

标签: node.js curl request zipfile node-libcurl

我正在尝试将以下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);

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

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

您有一些错误:

已修改:如何从响应中写入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)

您似乎有两个问题:

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

  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;它具有相同的请求格式,但是您可以放弃回调并使用promise,这被认为是惯用的,从长远来看会更容易。)