当前位置: 首页 > 知识库问答 >
问题:

如何通过API向Google Drive添加/创建/插入文件?

宋昕
2023-03-14

需要有关通过api将文件插入google驱动器的帮助。为此目的的api留档没有明确解释如何通过超文本传输协议post请求发送文件的实际正文。

共有3个答案

栾耀
2023-03-14

4年后,这仍然很难弄清楚。我接受了@user1158023的回答来支持上传图像。我正在使用API v3和superagent.js来帮助我(因为gapi.client.request正在将请求发送到content.googleapis.com!?)。希望有人会觉得这很有用。

function gd_uploadFile(name, contentType, data, callback) {
    const boundary = '-------314159265358979323846';
    const delimiter = "\r\n--" + boundary + "\r\n";
    const close_delim = "\r\n--" + boundary + "--";

    contentType = contentType || "text/html";
    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';

    //Transfer images as base64 string.
    if (contentType.indexOf('image/') === 0) {
        var pos = data.indexOf('base64,');
        multipartRequestBody += 'Content-Transfer-Encoding: base64\r\n' + '\r\n' +
            data.slice(pos < 0 ? 0 : (pos + 'base64,'.length));
    } else {
        multipartRequestBody +=  + '\r\n' + data;
    }
    multipartRequestBody += close_delim;

    if (!callback) { callback = function(file) { console.log("Update Complete ", file) }; }

    superagent.post('https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart').
        set('Content-Type', 'multipart/form-data;  boundary="' + boundary + '"').
        set('Authorization', 'Bearer ' + gapi.auth.getToken().access_token).
        send(multipartRequestBody).
        end(function () {
            console.log(arguments);
        });
}

//On upload
$('#file')[0].onchange = function () {
    var file = $('#file')[0].files[0];
    if (file && file.type === 'image/jpeg') {
        var reader = new FileReader();
        reader.onloadend = function () {
            var data = reader.result;
            gd_uploadFile('img.jpg', 'image/jpeg', data, function () {
                console.log(arguments);
            });
        }
        reader.readAsDataURL(file);
    }
};

index.html

...
<form>
    <span>Upload: </span><input id="file" type="file" name="myFile">
</form>
...
马才
2023-03-14

谢谢你的解释!这花了我几个小时在蹩脚的谷歌SDK留档上兜圈子(抱歉我不得不发牢骚)。

下面是我创建的一个函数,它将更新一个文本文件(正如您可以看到的,我正在更新html):

  function gd_updateFile(fileId, folderId, text, callback) {

    const boundary = '-------314159265358979323846';
    const delimiter = "\r\n--" + boundary + "\r\n";
    const close_delim = "\r\n--" + boundary + "--";

    var contentType = "text/html";
    var metadata = {'mimeType': contentType,};

    var multipartRequestBody =
        delimiter +  'Content-Type: application/json\r\n\r\n' +
        JSON.stringify(metadata) +
        delimiter + 'Content-Type: ' + contentType + '\r\n' + '\r\n' +
        text +
        close_delim;

    if (!callback) { callback = function(file) { console.log("Update Complete ",file) }; }

    gapi.client.request({
        'path': '/upload/drive/v2/files/'+folderId+"?fileId="+fileId+"&uploadType=multipart",
        'method': 'PUT',
        'params': {'fileId': fileId, 'uploadType': 'multipart'},
        'headers': {'Content-Type': 'multipart/mixed; boundary="' + boundary + '"'},
        'body': multipartRequestBody,
        callback:callback,
    });
  }

这是google示例(使用上传的二进制文件)的混搭,以及上面@Nivco的精彩解释。

曹建华
2023-03-14

有关插入操作的文档已经包含一系列编程语言的示例,下面介绍如何使用Google云端硬盘API的基于HTTP的协议进行操作。

首先,将新文件元数据发布到驱动器endpoint。它必须采用文件资源JSON对象的形式:

POST /drive/v2/files HTTP/1.1
Host: www.googleapis.com
Authorization: Bearer <OAuth 2.0 access token here>
...

{
  "title": "file_name.extension",
  "mimeType": "mime/type",
  "description": "Stuff about the file"
}

响应主体将是新创建的文件资源的JSON表示。它看起来会像:

{
  "kind": "drive#file",
  "id": string,
  "etag": etag,
  "selfLink": string,
  "title": "file_name",
  "mimeType": "mime/type",
  "description": "Stuff about the file"
  ...
  "downloadUrl": string,
  ...
}

这是对文件条目已创建的确认。现在您需要上传内容。为此,您需要获取上面响应中id JSON属性给出的文件ID,并使用OAuth 2.0授权请求将实际文件的内容放入上传endpoint。它应该如下所示:

PUT /upload/drive/v2/files/{id}?uploadType=media HTTP/1.1
Host: www.googleapis.com
Authorization: Bearer <OAuth 2.0 access token here>
Content-Type: mime/type

<file content here>

您完成了:)

也有一种方法可以在一个使用多部分请求的单次POST请求中实现这一点,您可以在发布内容的同时发布文件的元数据。下面是一个例子:

POST /upload/drive/v2/files HTTP/1.1
Host: www.googleapis.com
Authorization: Bearer <OAuth 2.0 access token here>
Content-Type: multipart/form-data; boundary=287032381131322
...

--287032381131322
Content-Type: application/json

{
  "title": "file_name.extension",
  "mimeType": "mime/type",
  "description": "Stuff about the file"
}
--287032381131322
Content-Type: mime/type

<file content here>
--287032381131322--

响应将包含新创建的文件的元数据。您还可以在请求的子部分中使用内容传输编码:base64 标头,以便能够将文件的数据作为 Base 64 编码传递。

最后,还有一个可恢复的上传协议,它方便上传大文件,提供暂停/恢复功能和/或上传带有不稳定互联网连接的文件。

PS:大部分内容现在在Drive的文件上传留档中进行了描述。

 类似资料:
  • 我正在尝试使用最新的REST API发布JIRA的附件。这是我的代码: 然而,我得到了以下回应: 我的本地JIRA实例中确实存在密钥TEST-2问题,我可以在JIRA应用程序中“手动”添加附件。我知道我必须添加一个类型为“X-Atlassian-Token:nocheck”的头来防止XSRF,但是,从输出来看,我一定是做错了什么。。更让我困惑的是,在XSRF检查失败后抛出了404。 我在谷歌上搜索

  • 我有一个非常简单的REST API,它使用了jersey 2.x(Glassfish)。当我只输出hello world字符串时,它就起作用了。但是,当我添加几个JAR并在一行代码中使用它们时,它会抛出大量class错误。我没有编译或语法错误。这个错误很长,所以如果我在里面装了很多垃圾,请原谅。 我看到了很多解决这个问题的方法,但是我不理解它们的术语,例如,类路径需要被修复等等。 代码 eclip

  • 我正在尝试为尚未添加到GitHub Enterprise安装中的任何团队或组织的用户生成组织邀请。 我已经按照医生的指示: https://developer.github.com/v3/orgs/members/#create-组织邀请 并根据需要添加Accept标头: 应用程序/vnd.github.dazzler-preview json 我是该组织的所有者,但我仍然只收到: {"消息":"

  • 问题内容: 假设我捕获了一个屏幕截图。这是我的代码 而不是将其保存到图像中,我希望能够将其发送到我的SQL或MySQL并将它们存储为BLOB。 我也知道查询数据库。我不知道是中间部分。 在BLOB列中将使用哪种类型的INSERT插入,我猜这将是一个? 如果它是一个“字节”,则转换非常容易。 这样以后我就可以准备查询了 如果不是,那是 什么类型 以及 如何转换 问题答案: 您是正确的,您只需要将其上

  • 我想创建一个纯/文本哑剧类型文件,使用PHP和谷歌应用程序引擎上的谷歌驱动器的谷歌API。 当我使用: 没有内容写入文件。 如果我使用: 内容将添加到文件中。 这段代码来自Google文档: 显示“文本/纯”类型的 mime 类型的代码行 但是,同样,如果我使用它,则不会向文件中添加任何内容。创建纯文本文件和添加内容的设置是什么? 我的完整代码是这样的:

  • 问题内容: 我正在尝试在每天创建目录的目录中创建日志,但是fileHandler没有创建目录,而是其抛出异常 无法获取C:\ dir_date \ Logging.txt的锁 (此处dir_date不存在,我正在尝试创建登录到该目录)。我可以通过“ fileHandler”创建目录吗? log4J甚至可以创建目录(如果不存在),这是否可以通过fileHandler进行? 问题答案: julFile