如何在 Google 驱动器上上传文本文件?
How to upload text file on Google drive?
如何使用 CloudFunctions 在 Google 驱动器上上传文本文件?
文件已在本地文件夹中创建,但不确定如何将其传递到元数据正文中。
我遵循了以下方法:
第一步:写入文件
// Write file
fs.writeFileSync("sample.txt", "Hello content!");
第 2 步:准备元数据
const metadata = {
name: "sample.txt",
parents: [parentFolder],
mimeType: "text/plain",
uploadType: "media",
};
第三步:调用Google驱动器API上传文件
axios({
method: "POST",
url: "https://www.googleapis.com/drive/v3/files?supportsAllDrives=true",
headers: {
Authorization: `Bearer ${token}`,
Accept: "application/json",
"Content-Type": "application/json",
},
data: metadata,
})
.then((res) => {
response.status(200).send(res.data);
})
.catch((err) => {
response.status(500).send(err.message);
});
所以整个函数代码是:
exports.onCreateFile = functions.https.onRequest((request, response) => {
// <-- Some validation -->
const parentFolder = request.query.parentFolder;
if (!parentFolder) {
response.status(400).send("Parent folder not found");
return;
}
// Write file
fs.writeFileSync("vault.txt", "Hello content!");
const metadata = {
name: "vault.txt",
parents: [parentFolder],
mimeType: "text/plain",
uploadType: "media",
};
axios({
method: "POST",
url: "https://www.googleapis.com/drive/v3/files?supportsAllDrives=true",
headers: {
Authorization: `Bearer ${token}`,
Accept: "application/json",
"Content-Type": "application/json",
},
data: metadata,
})
.then((res) => {
// console.log(res.data);
response.status(200).send(res.data);
})
.catch((err) => {
// console.log(err);
response.status(500).send(err.message);
});
});
基本上,移动应用程序将通过传递 accessToken 和 parentFolderId 来调用 CloudFunction,而 cloudFunction 将在一些业务逻辑后上传文件。
您不能将文件作为元数据传递。相反,您可以像这样将其作为表单数据传递:
const metadata = { name: "sample.txt", mimeType: "text/plain", parents: ["root"] };
const fileContent = "Hello content!";
const fileBlob = new Blob([fileContent], {type: "text/plain"});
const form = new FormData();
form.append("metadata", JSON.stringify(metadata), { type: "application/json" }));
form.append("file", fileBlob);
fetch("https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart&supportsAllDrives=true", {
method: "POST",
headers: new Headers({ Authorization: `Bearer ${token}` }),
body: form,
});
最后通过以下方法解决了:
fs.writeFileSync("/tmp/sample.txt", "Hello Temp content!");
const metadata = {
name: "sample.txt",
mimeType: "text/plain",
parents: [parentFolder],
};
const formData = new FormData();
formData.append("metadata", JSON.stringify(metadata), {
contentType: "application/json",
});
formData.append("file", fs.createReadStream("/tmp/sample.txt"));
axios({
method: "POST",
url: "https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart&supportsAllDrives=true",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": `multipart/related; boundary=${formData.getBoundary()}`,
},
data: formData,
})
.then((res) => {
response.status(200).send(res.data);
})
.catch((err) => {
response.status(500).send(err);
});
这 Link 帮助解决了这个问题。
代表提问者发表
如何使用 CloudFunctions 在 Google 驱动器上上传文本文件?
文件已在本地文件夹中创建,但不确定如何将其传递到元数据正文中。
我遵循了以下方法:
第一步:写入文件
// Write file
fs.writeFileSync("sample.txt", "Hello content!");
第 2 步:准备元数据
const metadata = {
name: "sample.txt",
parents: [parentFolder],
mimeType: "text/plain",
uploadType: "media",
};
第三步:调用Google驱动器API上传文件
axios({
method: "POST",
url: "https://www.googleapis.com/drive/v3/files?supportsAllDrives=true",
headers: {
Authorization: `Bearer ${token}`,
Accept: "application/json",
"Content-Type": "application/json",
},
data: metadata,
})
.then((res) => {
response.status(200).send(res.data);
})
.catch((err) => {
response.status(500).send(err.message);
});
所以整个函数代码是:
exports.onCreateFile = functions.https.onRequest((request, response) => {
// <-- Some validation -->
const parentFolder = request.query.parentFolder;
if (!parentFolder) {
response.status(400).send("Parent folder not found");
return;
}
// Write file
fs.writeFileSync("vault.txt", "Hello content!");
const metadata = {
name: "vault.txt",
parents: [parentFolder],
mimeType: "text/plain",
uploadType: "media",
};
axios({
method: "POST",
url: "https://www.googleapis.com/drive/v3/files?supportsAllDrives=true",
headers: {
Authorization: `Bearer ${token}`,
Accept: "application/json",
"Content-Type": "application/json",
},
data: metadata,
})
.then((res) => {
// console.log(res.data);
response.status(200).send(res.data);
})
.catch((err) => {
// console.log(err);
response.status(500).send(err.message);
});
});
基本上,移动应用程序将通过传递 accessToken 和 parentFolderId 来调用 CloudFunction,而 cloudFunction 将在一些业务逻辑后上传文件。
您不能将文件作为元数据传递。相反,您可以像这样将其作为表单数据传递:
const metadata = { name: "sample.txt", mimeType: "text/plain", parents: ["root"] };
const fileContent = "Hello content!";
const fileBlob = new Blob([fileContent], {type: "text/plain"});
const form = new FormData();
form.append("metadata", JSON.stringify(metadata), { type: "application/json" }));
form.append("file", fileBlob);
fetch("https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart&supportsAllDrives=true", {
method: "POST",
headers: new Headers({ Authorization: `Bearer ${token}` }),
body: form,
});
最后通过以下方法解决了:
fs.writeFileSync("/tmp/sample.txt", "Hello Temp content!");
const metadata = {
name: "sample.txt",
mimeType: "text/plain",
parents: [parentFolder],
};
const formData = new FormData();
formData.append("metadata", JSON.stringify(metadata), {
contentType: "application/json",
});
formData.append("file", fs.createReadStream("/tmp/sample.txt"));
axios({
method: "POST",
url: "https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart&supportsAllDrives=true",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": `multipart/related; boundary=${formData.getBoundary()}`,
},
data: formData,
})
.then((res) => {
response.status(200).send(res.data);
})
.catch((err) => {
response.status(500).send(err);
});
这 Link 帮助解决了这个问题。
代表提问者发表