Google 驱动器 REST API - 上传后损坏的 ZIP 文件

Google Drive REST API - Corrupted ZIP file after upload

我正在使用 Google Drive REST API 上传 ZIP 文件,但我的所有 ZIP 文件在上传后都已损坏。当我下载文件然后尝试将其解压缩到我的计算机上时,在 MacOS 上显示“无法将 'FILE_NAME.zip' 扩展到文件夹中。错误 79 - 文件类型或格式不合适。”。我通过让另一台计算机上的另一个人尝试解压缩它来确保这不仅仅是我的计算机,他们遇到了同样的问题。我还确认 ZIP 文件没有损坏 之前 我将其上传到 Google 驱动器。

下面是我的代码的简化版本。

const async = require('async');
const requestModule = require('request');
const fs = require('fs');
var api = {};
var tasks = {
  // first, get the zip file contents
  'getFile': function(cb) {
    fs.readFile('my_file.zip', {'encoding':'UTF-8'}, function(err, data) {
      if (err) {
        console.error(err);
        return cb();
      }
      api.file_data = data;
      cb();
    });
  },
  // second, upload the file contents to google drive via their API
  'uploadFile': function(cb) {
      var metadata = {
        'mimeType': 'application/zip',
        'name': 'my_file.zip'
      };
      var request = {
        'url': 'https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart&supportsAllDrives=true',
        'method': 'POST',
        'headers': {
          'Authorization': 'Bearer ' + GOOGLE_ACCESS_TOKEN,
          'Content-Type': 'multipart/related; boundary="SECTION"'
        },
        'body': '--SECTION\r\n' +
                'Content-Type: application/json; charset=UTF-8\r\n' +
                '\r\n' +
                JSON.stringify(metadata) + '\r\n' +
                '\r\n' +
                '--SECTION\r\n' +
                'Content-Type: application/zip\r\n' +
                'Content-Transfer-Encoding: base64\r\n' +
                '\r\n' +
                new Buffer.from(api.file_data).toString('base64') + '\r\n' +
                '\r\n' +
                '--SECTION--'
      };
      requestModule(request, function(err, res, body) {
        if (err) {
          console.error(err);
          return cb();
        }
        cb();
      });
   }
};
async.series(tasks, function() {
  console.log('Done');
});

注意:我正在进行问答式 post 并将回答我自己的问题。

经过大量的试验和错误,归结为我在上传文件之前是如何阅读文件的。作为 copy/paste 的产物,readFile 函数的编码得以保留。当我删除 {'encoding':'UTF-8'} 然后上传文件时,生成的 zip 文件可以完美解压。

我只是删除了 readFile 上的编码,因此经过更改后的代码现在如下所示:

fs.readFile('my_file.zip', function(err, data) {
  // ...
});