使用Node.js从URL获取Zip文件并上传到Google Drive

3

我试图从一个URL获取zip文件,以便在下一步上传到Google Drive。但是我的代码不起作用。

// The method to get the zip File from the url

function getFile(){

var file = request({
  method : "GET",
  url : "https://start.spring.io/starter.zip",
  encoding: null // <- this one is important !
}, function (error, response, body) {
  if(error ||  response.statusCode !== 200) {
    // handle error
    return;
  }
  JSZip.loadAsync(body).then(function (zip) {
    return zip.file("content.txt").async("string");
  }).then(function () {
    console.log(text);
  });
});
}

// method to upload zip to drive 

function uploadFile(auth) {
    const drive = google.drive({ version: 'v3', auth });
    var fileMetadata = {
        'name': 'demo.zip'
    };
    var media = {
        mimeType: 'application/zip',
        body: fs.createReadStream(getFile())
    };
    drive.files.create({
        resource: fileMetadata,
        media: media,
        fields: 'id'
    }, function (err, res) {
        if (err) {
            // Handle error
            console.log(err);
        } else {
            console.log('File Id: ', res.data.id);
        }
    });
}

我想从上面的URL获取zip文件,但是它抛出了一个异常:

new ERR_INVALID_ARG_TYPE(propName, ['string', 'Buffer', 'URL'], path);

当我将正文更改为:fs.createReadStream("https://start.spring.io/starter.zip"),而不是fs.createReadStream(getFile())时。
the Exception is: no such file or directory, open 'https://start.spring.io/starter.zip
1个回答

0
  • 您想从URL下载一个zip文件并将其上传到您的Google Drive。
  • 您想使用Node.js和googleapis实现此操作。
  • 您已经能够使用Drive API获取和放置文件。

如果我的理解是正确的,那么这个修改怎么样?

修改要点:

  • 通过request检索到的值可以用于上传。
  • 从URL检索到的值被上传为缓冲区。因此,请将其转换为readstream类型。

当上述要点反映在您的脚本中时,它变成了以下内容。

修改后的脚本:

function getFile() {
  return new Promise(function(resolve, reject) {
    request(
      {
        method: "GET",
        url: "https://start.spring.io/starter.zip",
        encoding: null // <- this one is important !
      },
      function(error, response, body) {
        if (error && response.statusCode != 200) {
          reject(error);
          return;
        }
        resolve(body);
      }
    );
  });
}

function uploadFile(auth) {
  const stream = require("stream"); // In this script, use this module.

  getFile().then(body => {
    const bs = new stream.PassThrough();
    bs.end(body);
    const drive = google.drive({ version: "v3", auth });
    var fileMetadata = {
      name: "demo.zip"
    };
    var media = {
      mimeType: "application/zip",
      body: bs // Modified
    };
    drive.files.create(
      {
        resource: fileMetadata,
        media: media,
        fields: "id"
      },
      function(err, res) {
        if (err) {
          // Handle error
          console.log(err);
        } else {
          console.log("File Id: ", res.data.id);
        }
      }
    );
  });
}

其他模式:

当然,uploadFile() 也可以修改如下。

async function uploadFile(auth) {
  const stream = require("stream"); // In this script, use this module.

  const buffer = await getFile();
  const bs = new stream.PassThrough();
  bs.end(buffer);

  const drive = google.drive({ version: "v3", auth });
  var fileMetadata = {
    name: "demo.zip"
  };
  var media = {
    mimeType: "application/zip",
    body: bs // Modified
  };
  drive.files.create(
    {
      resource: fileMetadata,
      media: media,
      fields: "id"
    },
    function(err, res) {
      if (err) {
        // Handle error
        console.log(err);
      } else {
        console.log("File Id: ", res.data.id);
      }
    }
  );
}

参考资料:

在我的环境下,我确认这个修改后的脚本可以工作。但如果我误解了您的问题,这不是您想要的结果,我很抱歉。


它正在运行!非常感谢您详细的回复! - Klaus Kledan
@Klaus Kledan 感谢您的回复。我很高兴您的问题已经解决。 - Tanaike

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接