使用Google Drive SDK上传JSON文件是零字节(javascript)

时间:2014-10-23 19:41:35

标签: javascript google-drive-api google-chrome-app

我正在使用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。

2 个答案:

答案 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:6564x-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

引用者: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