我正在尝试从网址获取zip文件,以便在下一步将其上传到Google驱动器。但是我的代码不起作用。



// 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);
        }
    });
}





我想从上面的网址获取zip文件,但是它抛出异常:

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


当我将正文:fs.createReadStream(getFile())更改为正文:fs.createReadStream("https://start.spring.io/starter.zip")

the Exception is: no such file or directory, open 'https://start.spring.io/starter.zip

最佳答案

您要从URL下载一个zip文件,然后将其上传到您的Google云端硬盘。
您想使用带有Node.js的googleapis实现此目的。
您已经可以使用Drive API获取和放置文件。


如果我的理解是正确的,那么该修改如何?

修改要点:


通过request从URL检索的值可以用于上载。
从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);
      }
    }
  );
}


参考文献:


Class: stream.PassThrough
google-api-nodejs-client
Files: create of Drive API v3


在我的环境中,我可以确认此修改后的脚本有效。但是,如果我误解了您的问题,而这不是您想要的结果,我深表歉意。

关于node.js - Node js从URL获取邮政编码并上传到Google驱动器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57365997/

10-10 21:44