我正在使用Google Drive SDK从javascript(https://developers.google.com/drive/v2/reference/files/insert上传文件,使用uploadType multipart指定内容和元数据)。
我可以上传图片(mimeType image / jpeg)。但是,上传纯文本(mimeType text / plain)或JSON(mimeType application / json)文件会导致创建一个空文件。
我的工作是将文件内容mimeType指定为' application / octet-stream'一切正常。
任何人都知道为什么为json内容指定应用程序/ json的mimeType,或者为文本内容指定text / plain会导致空文件,而更改为application / octet-stream工作正常?
我应该注意,因为我的代码是作为Chrome应用程序的一部分运行的,所以我不得不修改一个gapi客户端(因为标准版本违反了CORS)。顺便说一句,google javascript api(gapi)客户端代码是否可以在某个代码存储库中查看?
我的上传代码的摘录是:
var metadata = {
'title': ufilename,
'mimeType': contentType,
'modifiedDate' : modifiedDate,
'parents': [{'id':parentGuid}]
};
var multipartRequestBody =
delimiter +
'Content-Type: application/json\r\n\r\n' +
JSON.stringify(metadata) +
delimiter +
'Content-Type: ' + contentType + '\r\n' +
'\r\n' +
JSON.stringify(jsonObj) +
close_delim;
var reqObj = {
'path': '/upload/drive/v2/files',
'method': 'POST',
'params': {'uploadType': 'multipart'},
'headers': {
'Content-Type': 'multipart/mixed; boundary="' + boundary + '"'
},
'body': multipartRequestBody
};
var request = gapi.client.request(reqObj);
根据要求,示例请求为:
headers: Content-Type: "multipart/mixed; boundary="-------314159265358979323846"
method: "POST"
params: uploadType: "multipart"
path: "https://www.googleapis.com/upload/drive/v2/files"
body:
---------314159265358979323846
Content-Type: application/json
{"title":"survey.json","mimeType":"application/octet-stream","modifiedDate":"2014-10-24T08:17:45.099-06:00","parents":[{"id":"0B4ho7vdmkgJOczc4NENqd0d0TDg"}]}
---------314159265358979323846
Content-Type: application/octet-stream
{"model":{"DateTime":{"type":"datetime","required":true},"Bird":{"type":"string"},"Photo": {"type":"image"},"Notes":{"type":"string"},"Location":{"type":"geopoint"}},"settings":[{"setting":"form_id","value":"birdwatching"},{"setting":"form_version","value":1},{"setting":"form_category","value":"Tracking"},{"setting":"form_title","value":"Bird Watching"}],"survey":[{"name":"DateTime","type":"datetime","label":"Date and Time"},{"name":"Location","type":"geopoint","label":"Location"},{"name":"Bird","type":"string-auto","label":"Bird"},{"type":"text","name":"Notes","label":"Notes"},{"name":"Photo","type":"image","label":"Photo"}],"choices":{}}
---------314159265358979323846--
在所有情况下(不管mime-type)我得到一个readyState 4 / status 200的返回对象。唯一的区别是如果Content-Type是我指定的application / json的mimetype,则fileSize是0。
答案 0 :(得分:3)
原来问题是我的自定义gapi客户端没有正确设置" uploadType" as" multipart"。出于某种原因,只要mime-type不是text / plain或application / json,这似乎并不重要。
正确设置uploadType可以正常使用所有mime类型。
答案 1 :(得分:1)
以下是使用http://www.clevernote.co/app/drivecrud.html
生成的http多部分示例看一下,我说唯一的区别是数据的base64编码,我在你的网站上看不到x-upload-content-length:6564
和x-upload-content-type:text/plain
。
HTH
:主机:www.googleapis.com
:方法:POST
:路径:/上传/驱动/ V2 /文件uploadType =多&安培; ALT = JSON
接受:application / json,text / plain, /
接受编码:gzip,放气
接受语言:EN-US,EN; Q = 0.8,EN-AU; Q = 0.6
授权:持票人ya29.qAAz3aEs6QohclT8eRlX0pqEwvSQv8nS4FHXjhN7OG
内容长度:6824
内容类型:多部分/混合;边界=" ------- 3141592ff65358979323846"
引用者:http://www.clevernote.co/app/drivecrud.html
的x客户端的数据:CKS1yQEIh7bJAQiktskpPKAQjelsoB
的x上载内容长度:6564
的x上载内容类型:文本/无格式
查询字符串参数查看源视图URL编码
uploadType:多
ALT:JSON
请求有效负载
--------- 3141592ff65358979323846
Content-Type:application / json
{" $承诺":{},"标题":"代尔姆"" mime类型":"文本/平原"}
--------- 3141592ff65358979323846
Content-Type:text / plain
Content-Transfer-Encoding:base64
... IERhdGUsRGVzY3JpcHRpb24sQmFuayAgICAgUmVmZXJlbmNlLEN1c3RvbWVyICBSZWZlcmVuY2UsQ3JlZGl0LERlYml