![](/img/trans.png)
[英]Google Drive API V3 Javascript - Create File with Content
[英]Create File with Google Drive Api v3 (javascript)
我想使用 Google Drive API v3 创建一个包含内容的文件。 我已通过 OAuth 进行身份验证并加载了 Drive API。 类似于以下工作的语句(但生成一个没有内容的文件):
gapi.client.drive.files.create({
"name": "settings",
}).execute();
不幸的是,我无法弄清楚如何创建一个包含内容的文件。 我找不到使用 Drive API v3 的 JavaScript 示例。 是否有一些我需要传递的特殊参数?
为简单起见,假设我有一个像 '{"name":"test"}' 这样的字符串,它是 JSON 格式的,应该是所创建文件的内容。
不幸的是,我还没有找到仅使用 google drive api 的答案,而是按照 Gerardo 的评论并使用了 google request api。 下面是一个将文件上传到谷歌驱动器的功能。
var createFileWithJSONContent = function(name,data,callback) {
const boundary = '-------314159265358979323846';
const delimiter = "\r\n--" + boundary + "\r\n";
const close_delim = "\r\n--" + boundary + "--";
const contentType = 'application/json';
var metadata = {
'name': name,
'mimeType': contentType
};
var multipartRequestBody =
delimiter +
'Content-Type: application/json\r\n\r\n' +
JSON.stringify(metadata) +
delimiter +
'Content-Type: ' + contentType + '\r\n\r\n' +
data +
close_delim;
var request = gapi.client.request({
'path': '/upload/drive/v3/files',
'method': 'POST',
'params': {'uploadType': 'multipart'},
'headers': {
'Content-Type': 'multipart/related; boundary="' + boundary + '"'
},
'body': multipartRequestBody});
if (!callback) {
callback = function(file) {
console.log(file)
};
}
request.execute(callback);
}
这是gapi.client.drive
的解决方案,
var parentId = '';//some parentId of a folder under which to create the new folder
var fileMetadata = {
'name' : 'New Folder',
'mimeType' : 'application/vnd.google-apps.folder',
'parents': [parentId]
};
gapi.client.drive.files.create({
resource: fileMetadata,
}).then(function(response) {
switch(response.status){
case 200:
var file = response.result;
console.log('Created Folder Id: ', file.id);
break;
default:
console.log('Error creating the folder, '+response);
break;
}
});
https://www.googleapis.com/auth/drive
https://www.googleapis.com/auth/drive.file
编辑:可以通过将mimeType
从application/vnd.google-apps.folder
更改为受支持的google mime types之一来创建 google 文件(doc、sheets 等)。 但是,到目前为止,无法将任何内容上传到创建的文件中。
要上传文件,请使用@Geminus 提供的解决方案。 请注意,您可以上传文本文件或 csv 文件并将其内容类型分别设置为 google doc 或 google sheet,谷歌将尝试对其进行转换。 我已经针对 text -> doc 测试过它并且它有效。
使用gapi.client.drive
,无法上传文件内容。 您只能上传元数据。
相反,建议直接使用 Google REST API。 此解决方案使用FormData
对象构建多部分表单主体,这简化了实现,并使用gapi.auth.getToken()
来检索所需的访问令牌。 该解决方案也适用于Google 共享驱动器:
var fileContent = "sample text"; // fileContent can be text, or an Uint8Array, etc.
var file = new Blob([fileContent], {type: "text/plain"});
var metadata = {
"name": "yourFilename",
"mimeType": "text/plain",
"parents": ["folder id or 'root'"], // Google Drive folder id
};
var accessToken = gapi.auth.getToken().access_token;
var form = new FormData();
form.append('metadata', new Blob([JSON.stringify(metadata)], { type: 'application/json' }));
form.append('file', file);
fetch("https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart&supportsAllDrives=true", {
method: 'POST',
headers: new Headers({ 'Authorization': 'Bearer ' + accessToken }),
body: form,
}).then((res) => {
return res.json();
}).then(function(val) {
console.log(val);
});
这在 v3 中工作正常:
var fileMetadata = {
'name' : 'MaxBarrass',
'mimeType' : 'application/vnd.google-apps.folder'
};
gapi.client.drive.files.create({
resource: fileMetadata,
fields: 'id'
}).execute(function(resp, raw_resp) {
console.log('Folder Id: ', resp.id);
});
/* Now to create a new file */
function insertNewFile(folderId)
{
var content = " ";
var FolderId = "";
var contentArray = new Array(content.length);
for (var i = 0; i < contentArray.length; i++)
{
contentArray[i] = content.charCodeAt(i);
}
var byteArray = new Uint8Array(contentArray);
var blob = new Blob([byteArray], {type: 'text/plain'});
insertFile(blob, fileInserted, folderId);
}
function fileInserted(d)
{
setPercent("100");
var FI = FolderId;
if(FI !== myRootFolderId)
{
insertFileIntoFolder(FI, d.id);
removeFileFromFolder(d.parents[0].id,d.id);
}
openFile(d.id);
}
function insertFileIntoFolder(folderId, fileId)
{
var body = {'id': folderId};
var request = gapi.client.drive.parents.insert({
'fileId': fileId,
'resource': body });
request.execute(function(resp) { });
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.