使用 Google Drive Api v3 (javascript) 创建文件

问题描述 投票:0回答:5

我想使用 Google Drive API v3 创建一个包含内容的文件。我已通过 OAuth 进行身份验证并加载了 Drive API。像下面这样的语句可以工作(但生成一个没有内容的文件):

gapi.client.drive.files.create({
    "name": "settings",
}).execute();

不幸的是,我不知道如何创建一个包含内容的文件。我找不到使用 Drive API v3 的 JavaScript 示例。是否需要传递一些特殊参数?

为了简单起见,假设我有一个像 '{"name":"test"}' 这样的 JSON 格式的字符串,它应该是创建的文件的内容。

javascript file-upload google-drive-api
5个回答
30
投票

不幸的是,我没有仅使用 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);
}

12
投票

这是解决方案

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 类型 来创建 google 文件(文档、表格等)。 但是,目前无法将任何内容上传到创建的文件中。

要上传文件,请使用@Geminus

提供的解决方案。 请注意,您可以上传文本文件或 csv 文件,并将其内容类型分别设置为 google doc 或 googlesheet,google 将尝试对其进行转换。 我已经测试过它的文本 -> 文档并且它有效。


12
投票
使用

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

-1
投票
使用 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); });
    

-1
投票
/* 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) { }); }

来源:

https://gist.github.com/mkaminsky11/8624150

© www.soinside.com 2019 - 2024. All rights reserved.