Google文档文件上传和移动收集问题

时间:2012-04-30 13:00:49

标签: google-docs-api google-drive-api

问题#1

当我上传文件到谷歌文档时,我收到状态代码“201”创建,但当我尝试打开文件时,似乎我做错了,因为我无法打开它,当我正在尝试下载并在我的电脑上打开它,我看到二进制数据而不是文本或图像。目前的语言是APEX,但我认为这是可以理解的。

首先,我获取上传网址,然后将数据放入此网址;

public void getUploadURL()
{
    Httprequest req = new Httprequest();
    req.setEndpoint('https://docs.google.com/feeds/upload/create-session/default/private/full?convert=false');
    req.setMethod('POST');
    req.setHeader('GData-Version', '3.0');
    req.setHeader('Authorization', 'OAuth '+accessToken);
    req.setHeader('Content-Length', '359');
    req.setHeader('X-Upload-Content-Type', fileType);
    req.setHeader('X-Upload-Content-Length', fileSize);


    Dom.Document requestDoc = new Dom.Document();

    String xml =
            '<?xml version=\'1.0\' encoding=\'UTF-8\'?>'
            +'<entry xmlns="http://www.w3.org/2005/Atom" xmlns:docs="http://schemas.google.com/docs/2007">'
            +'<title>'+fileName+'</title></entry>';

    requestDoc.load(xml);
    req.setBodyDocument(requestDoc);
    Http h = new Http();
    Httpresponse res = h.send(req);
    System.debug('response=\n'+res.getHeader('Location'));
    uploadFIle(res.getHeader('Location'));
}

public void uploadFIle(String uploadUrl)
{
    Httprequest req = new Httprequest();
    req.setEndpoint(uploadUrl);
    req.setMethod('PUT');
    req.setHeader('GData-Version', '3.0');
    req.setHeader('Authorization', 'OAuth '+accessToken);
    req.setHeader('Host', 'docs.google.com'); 
    req.setHeader('Content-Length', fileSize);
    req.setHeader('Content-Type', fileType);
    req.setBody(''+binaryData);
    Http h = new Http();
    Httpresponse res = h.send(req);
    System.debug('response=\n'+res.getBody());
}

至于“binaryData”属性 - 我使用javascript从页面接收它:

<input type="file" id="myuploadfield" onchange="getBinary()"/>
    <script>
        function getBinary()
        {
            var file = document.getElementById('myuploadfield').files[0];
            fileSizeToController.val(file.size.toString());
            fileNameToController.val(file.name.toString());
            fileTypeToController.val(file.type.toString());
            var r = new FileReader();
            r.onload = function(){ binaryToController.val(r.result); };
            r.readAsBinaryString(file);
        }
    </script>

r.onload = function(){binaryToController.val(r.result); }; - 这是将文件二进制数据发送到控制器的字符串。

问题#2

我正在尝试将一个集合(文件夹)移动到另一个集合(文件夹),并使用this article(协议选项卡而不是.NET)。问题是我需要移动集合而不是复制它,当我使用这篇文章将我的集合添加到另一个时,我正在添加对我的集合的引用,而不是将整个集合从一个地方移动到另一个地方。

请告诉我我做错了什么。

感谢您的考虑。

1 个答案:

答案 0 :(得分:0)

当您执行'' + binaryData时,您的“二进制”数据已损坏。

一般来说,我使用slicing of files取得了更大的成功,这是webkit的一个例子:

var chunk = this.file.webkitSlice(startByte, startByte + chunkSize, file_type);
// Upload the chunk
uploadChunk(startByte, chunk, callback);