【问题标题】:Convert curl upload files to request in Node.JS and write zip file将 curl 上传文件转换为 Node.JS 中的请求并写入 zip 文件
【发布时间】:2018-12-16 23:49:01
【问题描述】:

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

但我一直收到错误消息,例如没有给出文件或无法打开文件。

感谢任何帮助。

【问题讨论】:

  • 这里只是一个错字,不在我的代码中。

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


【解决方案1】:

你有一些错误:

已编辑:如何从响应中写入 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 } } }

【讨论】:

  • 有效!但现在我还有一个问题。 response.body 将是一个 zip 文件,所以这是我在回调中尝试做的事情。 fs.writeFile("output.zip", body, function(err) {} 但不知怎的,我只得到了文件的一小部分......
  • @Paul 我已经更新了我的答案如何编写 zip 文件 :))
  • 刚刚做到了!抱歉,我是 stackoverflow 菜鸟。永远不知道我可以接受某人的回答大声笑。再次感谢!
【解决方案2】:

看起来您可能有两个问题:

    1234563 /li>
  1. 您传递的是字符串(文件名),而不是(文件内容)。

    李>

试试这样的:

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

【讨论】:

  • 有效!但现在我还有一个问题。 response.body 将是一个 zip 文件,所以这是我在回调中尝试做的事情。 fs.writeFile("output.zip", body, function(err) {} 但不知怎的,我只得到了几份文件……
  • 要将响应流式传输到文件,请查看github.com/request/request README 中的前几个示例 - 您可以将响应通过管道传输到 createWriteStream
猜你喜欢
  • 2015-08-10
  • 1970-01-01
  • 1970-01-01
  • 2020-06-28
  • 2019-05-12
  • 1970-01-01
  • 2018-06-07
  • 2021-12-27
  • 2020-05-20
相关资源
最近更新 更多