我正在尝试从网址获取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/