需要有关插入文件,以谷歌通过API驱动的帮助。 用于此目的的API文档没有明确说明如何通过HTTP POST请求发送文件的实际身体。
Answer 1:
在上插入操作文档中已经包含的例子在一堆的编程语言,在这里是如何使用谷歌云端硬盘API的基于HTTP协议来做到这一点。
首先,发布新文件元数据驱动器端点。 它是在一个形式文件资源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用户授权的请求把实际的文件上传端点的内容。 它应该是这样的:
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>
你完成了:)
还有一种方式,1个单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:这个最现在描述驱动器的文件上传文档 。
Answer 2:
感谢您的解释! 这已在与谷歌蹩脚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,
});
}
这是谷歌的例子的混搭(使用来自上传的二进制文件),并从上面@Nivco漂亮的解释。
Answer 3:
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>
...
Answer 4:
我哗哗有用于驱动gapis V3更好的例子......我花了一些时间来弄清楚如何将新的内容上传与创建的现有文件
gapi.client.drive.files.create({ "name" : "savefile.txt" }).execute(function(file) { console.log("Created file " + file.name + " id: " + file.id); });
但最终我试图加入的fileid的路径和改变方法补丁“幸运”的组合
function uploadFile(id, text)
{
var auth_token = gapi.auth.getToken().access_token;
const boundary = '-------314159265358979323846';
const delimiter = "\r\n--" + boundary + "\r\n";
const close_delim = "\r\n--" + boundary + "--";
var metadata = {
description : 'savefile for my game',
'mimeType': 'application/json'
};
var multipartRequestBody =
delimiter + 'Content-Type: application/json\r\n\r\n' +
JSON.stringify(metadata) +
delimiter + 'Content-Type: application/json\r\n\r\n' +
text +
close_delim;
gapi.client.request
( {
'path': '/upload/drive/v3/files/'+id,
'method': 'PATCH',
'params': {'fileId': id, 'uploadType': 'multipart'},
'headers': { 'Content-Type': 'multipart/form-data; boundary="' + boundary + '"', 'Authorization': 'Bearer ' + auth_token, },
'body': multipartRequestBody
}).execute(function(file) { console.log("Wrote to file " + file.name + " id: " + file.id); });
}
但我想,现在在整个文档https://developers.google.com/drive/v3/reference/files/update开始道理给我:-)
Answer 5:
在谷歌云端硬盘API团队发布了V3在2015年年底,并在该版本中, insert()
改了个名字,以create()
以更好地反映该文件的操作。 该文件也得到了提高:现在有一个专门上传特殊指导 (简单,多和可恢复)随使用Java,Python,PHP,C#/。NET,红宝石,JavaScript的/ Node.js的,和iOS示例代码。 /对象 - 上传一个普通文件,另一个用于导入CSV文件作为谷歌表。
只是为了显示简单的是,下面是短文件一个备用的Python的解决方案(以样品中的文档)(“简单的上传”),您不需要apiclient.http.MediaFileUpload
类。 该段假定您的身份验证代码工作在您的服务端点是DRIVE
与最低身份验证范围https://www.googleapis.com/auth/drive.file
。
# filenames & MIMEtypes
DST_FILENAME = 'inventory'
SRC_FILENAME = DST_FILENAME + '.csv'
SHT_MIMETYPE = 'application/vnd.google-apps.spreadsheet'
CSV_MIMETYPE = 'text/csv'
# Import CSV file to Google Drive as a Google Sheets file
METADATA = {'name': DST_FILENAME, 'mimeType': SHT_MIMETYPE}
rsp = DRIVE.files().create(body=METADATA, media_body=SRC_FILENAME).execute()
if rsp:
print('Imported %r to %r (as %s)' % (SRC_FILENAME, DST_FILENAME, rsp['mimeType']))
请注意,如果你正在写一个Android应用程序,有一个单独的谷歌云端硬盘API为Android有自己的一套文档的。 最后,如果你使用谷歌上的Apps脚本的JavaScript,无论是驱动服务原生对象和驱动先进的服务仍然使用API第2版。