如何从 POST 请求中获取带有存档器的压缩文件?

Posted

技术标签:

【中文标题】如何从 POST 请求中获取带有存档器的压缩文件?【英文标题】:How can I get a compressed file with archiver from a POST request? 【发布时间】:2019-08-13 00:09:14 【问题描述】:

我正在使用 Express 构建一个 NodeJS API,当您创建一个 POST 时,它会根据请求的正文生成一个 TAR 文件。

问题:

当端点是POST 时,我可以访问请求的主体,并且似乎可以用它来做事。但是,我无法从中看到/使用/测试压缩文件(据我所知)。

当端点是GET 时,我无法访问请求的正文(据我所知),但我可以在浏览器中查询 URL 并获取压缩文件。

基本上,我想解决“据我所知”之一。到目前为止,这是我的相关代码:

const fs = require('fs');
const serverless = require('serverless-http');
const archiver = require('archiver');
const express = require('express');
const app = express();
const util = require('util');

app.use(express.json());


app.post('/', function(req, res) 
  var filename = 'export.tar';

  var output = fs.createWriteStream('/tmp/' + filename);

  output.on('close', function() 
    res.download('/tmp/' + filename, filename);
  );

  var archive = archiver('tar');

  archive.pipe(output);

  // This part does not work when this is a GET request.
  // The log works perfectly in a POST request, but I can't get the TAR file from the command line.
  res.req.body.files.forEach(file => 
    archive.append(file.content,  name: file.name );
    console.log(`Appending $file.name file: $JSON.stringify(file, null, 2)`);
  );

  // This part is dummy data that works with a GET request when I go to the URL in the browser
  archive.append(
    "<h1>Hello, World!</h1>",
     name: 'index.html' 
  );

  archive.finalize();
);

我发送给此的 JSON 正文数据示例:


  "title": "Sample Title",
  "files": [
    
      "name": "index.html",
      "content": "<p>Hello, World!</p>"
    ,
    
      "name": "README.md",
      "content": "# Hello, World!"
    
  ]

我应该发送JSON 并根据SON 获得一个TAR。 POST 是错误的方法吗?如果我使用GET,应该改变什么以便我可以使用JSON 数据?有没有办法“菊花链”请求(这看起来不干净,但也许是解决方案)?

【问题讨论】:

通常你不会用 GET 请求发送正文,(***.com/questions/978061/http-get-with-request-body) 你看过这个例子吗github.com/archiverjs/node-archiver/blob/master/examples/… @PruthviP 是的,这就是问题所在!我想发送一个正文,但我想获取 TAR 文件。由于正文的原因,我无法执行该示例建议的 GET,但如果我想要该文件,我似乎无法执行 POST。 【参考方案1】:

试试这个:

app.post('/', (req, res) => 
  const filename = 'export.tar';

  const archive = archiver('tar', );

  archive.on('warning', (err) => 
    console.log(`WARN -> $err`);
  );

  archive.on('error', (err) => 
    console.log(`ERROR -> $err`);
  );

  const files = req.body.files || [];
  for (const file of files) 
    archive.append(file.content,  name: file.name );
    console.log(`Appending $file.name file: $JSON.stringify(file, null, 2)`);
  

  try 
    if (files.length > 0) 
      archive.pipe(res);
      archive.finalize();
      return res.attachment(filename);
     else 
      return res.send( error: 'No files to be downloaded' );
    
   catch (e) 
    return res.send( error: e.toString() );
  
);

【讨论】:

很遗憾这次超时了! 是的,我自己试过了。 @CassidyWilliams 你需要保留本地文件吗? 我只需要保留生成的TAR文件! @CassidyWilliams 刚刚更新了我的回复。它对我有用。请尝试一下

以上是关于如何从 POST 请求中获取带有存档器的压缩文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Alamofire 发送带有压缩内容的 HTTP POST 请求?

从 ZIP 存档中导出文件列表而不解压缩

如何在不解压缩的情况下列出 zip 存档中的文件?

从python中的tar存档中提取压缩的gz文件

在 USB 密钥上的压缩存档中获取过去 5 天内修改的文件

通过终端存档/压缩命令 FTP?