- 您想要从 URL 下载 zip 文件并将其上传到您的 Google 云端硬盘。
- 您希望使用 googleapis 和 Node.js 来实现此目的。
- 您已经能够使用 Drive API 获取和放置文件。
如果我的理解是正确的,那么这个修改怎么样?
修改要点:
- 从 URL 检索的值
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);
}
}
);
}
参考:
- 类:stream.PassThrough https://nodejs.org/api/stream.html#stream_class_stream_passthrough
- google-api-nodejs-客户端 https://github.com/googleapis/google-api-nodejs-client/tree/master/samples/drive
- 文件:创建 Drive API v3 https://developers.google.com/drive/api/v3/reference/files/create
在我的环境中,我可以确认这个修改后的脚本有效。但如果我误解了你的问题并且这不是你想要的结果,我深表歉意。