【问题标题】:Create File with Google Drive Api v3 (javascript)使用 Google Drive Api v3 (javascript) 创建文件
【发布时间】:2016-01-20 16:28:35
【问题描述】:

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

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

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

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

【问题讨论】:

  • 查看此文档,我知道是针对 v2 的,但过程非常相似。您需要将 url 中的版本更改为 v3 并根据 v3 更改参数(例如,而不是 'title' 使用 'name')developers.google.com/drive/v2/reference/files/insert#examples
  • 感谢您的链接,但我认为这有点违背使用库的精神(至少在 v3 中):在其他情况下,我不必自己构建请求。在这里,我必须选择我希望它是一个“POST”请求的想法,并且必须将事物连接成一个由边界分隔的长字符串。我认为 v3 的重点是避免这些事情,我想应该有另一种方法来做到这一点。
  • 看看来自 Google 一些开发人员的 upload.js。我有 drive v3 api here 的修改版本

标签: javascript google-drive-api


【解决方案1】:

不幸的是,我没有找到仅使用 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 做到这一点,我很想知道。
  • 谢谢。我快疯了。
  • 我的文件夹中有文件并使用 URL 上传如何执行此操作?
  • 我怎样才能得到这个文件的内容?
  • @DavidGiven 用gapi.client.drive发布了一个解决方案
【解决方案2】:

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

您需要使用following scopes 中的任何一个connect/authorise

https://www.googleapis.com/auth/drive
https://www.googleapis.com/auth/drive.file

编辑:可以通过将mimeTypeapplication/vnd.google-apps.folder 更改为受支持的google mime types 之一来创建谷歌文件(文档、表格等)。 但是,目前无法将任何内容上传到创建的文件中。

要上传文件,请使用solution provided by @Geminus。请注意,您可以上传文本文件或 csv 文件,并将其内容类型分别设置为 google doc 或 google sheet,google 将尝试对其进行转换。我已经为 text -> doc 测试了这个,它可以工作。

【讨论】:

  • 这会创建一个文件夹,而不是文件。
  • 这实际上是创建一个文件夹,我会尽快发布文件的解决方案
  • @DavidGiven,我刚刚编辑了我的答案,您可以创建文档/表格或任何其他支持的文件类型,但您不能使用 gapi.client.drive.files.create 实际上传内容。
  • 我没有编辑你的答案。我在上面编辑了我的评论(因为我看错了你的代码并且评论是错误的)。
  • 啊,是的!英语是一种愚蠢的语言,不是吗?无论如何,我感谢您的帮助;我仍然想要一个实际的解决方案......
【解决方案3】:

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

【讨论】:

  • 我参加聚会有点晚了,但是您有无法使用 gapi 上传文件内容的部分的来源吗?我正在查看文档并且感到困惑? @mario-varchmin
  • @bouffelec 我只保留工作代码,而不是代码,那是行不通的。我并不是说使用 gapi 无法上传,实际上我提出的解决方案是使用 gapi。我的意思是(在撰写本文时)使用适用于 JavaScript 的 Google API 客户端库是不可能的,而 Geminus 遇到了问题。
【解决方案4】:

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

【讨论】:

  • 这似乎是用于创建文件夹,而不是文件。
  • 是的,你可以用它来制作文件夹......它确实在“gapi.client.drive.files.create”中说“files.create”,它的所有节点最终都是这样,它们是更像是文件而不是文件夹...
  • 我意识到这一点,但是这个问题专门询问了有关创建文件的问题。所以很难理解为什么显示文件夹创建的示例会有用。
【解决方案5】:
/*  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

【讨论】:

  • 你错过了insertFile(),这实际上是在工作;与上面@Geminus 的回答相同,使用显式帖子上传数据。
猜你喜欢
  • 2019-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多