Appcelerator Titanium上传到谷歌驱动器 - Javascript中的Rest API - 错误404

时间:2014-11-06 11:27:19

标签: javascript http appcelerator google-drive-api

我尝试使用appcelerator钛将图像上传到谷歌驱动器。 我有OAuth,我有一个有效的access_token。

不幸的是,当我尝试上传图片时,我收到了404 http错误。

function Upload(blob){
Titanium.API.info(googleAuth.getAccessToken());
const boundary = '-------314159265358979323846';
const delimiter = "\r\n--" + boundary + "\r\n";
const close_delim = "\r\n--" + boundary + "--";

var request = Ti.Network.createHTTPClient({

onload : function(e) {

alert(this.requestText); },

    onerror : function(e) {
    Titanium.UI.createAlertDialog({
    title : 'Error',
    message : 'unable to upload' + JSON.stringify(e)
    }).show();
    },
    timeout : 60000

});

var metadata = {
    'title' : "image1.png",
    'mimeType': 'application/json',
};

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

    var uploadRequest = {
    'headers': {
      'Content-Type': 'multipart/mixed; boundary="' + boundary + '"',
      'access_token' : googleAuth.getAccessToken()
    },
    'body': mediaRequestBody};



var url = 'https://www.googleapis.com/upload/drivev2/files?uploadType=multipart';
request.open("POST", url);
request.send(uploadRequest);

}

通过执行以下操作检索我传递的'Blob':

var f = Titanium.Filesystem.getFile(Titanium.Filesystem.applicationDataDirectory,filename);
f.write(image);
var url = f.nativePath;
var blob = f.read();

我认为很接近,但这可能是我的http请求。

感谢!

This is the error i get jsonified

1 个答案:

答案 0 :(得分:1)

我在某个时候也遇到了同样类型的问题,以下是我能够解决的问题。

考虑到我有:

步骤1:将blob图像转换为base64编码的字符串。

var base64image = Ti.Utils.base64encode(blobData);

第2步:创建请求正文以将图片上传到云端硬盘。

var reqBody = '--foo_bar_baz\nContent-Type: application/json; charset=UTF-8\n\n{"title": "' + myFileName + '"}\n--foo_bar_baz\nContent-Type: image/jpeg\nContent-Transfer-Encoding: base64\n\n' + base64image + '\n--foo_bar_baz--';

第3步:为请求设置必要的标头。

client.setRequestHeader('Authorization', "Bearer " + myAccessToken); 
client.setRequestHeader('Content-Type', 'multipart/related; boundary="foo_bar_baz"' );  

基本代码段:

function upLoadFile(myAccessToken) {
    var base64image = Ti.Utils.base64encode(blobData); //convert blob to base64 encoded string

    var myFileName = "MyImage.png";
    var reqBody = '--foo_bar_baz\nContent-Type: application/json; charset=UTF-8\n\n{"title": "' + myFileName + '"}\n--foo_bar_baz\nContent-Type: image/jpeg\nContent-Transfer-Encoding: base64\n\n' + base64image + '\n--foo_bar_baz--';
    var url = "https://www.googleapis.com/upload/drive/v2/files";
    var client = Ti.Network.createHTTPClient({
        onload : function(e) {
            Ti.API.info("Received text: " + this.responseText);
            alert('success');
        },
        onerror : function(e) {
            Ti.API.debug(e.error);
            alert('error');
        },
        timeout : 100000000
    });
    client.open("POST", url);
    client.setRequestHeader('Authorization', "Bearer " + myAccessToken); 
    client.setRequestHeader('Content-Type', 'multipart/related; boundary="foo_bar_baz"' ); 
    client.send(reqBody);
}

P.S:此答案使用Drive API v2,另请参阅Manage Upload上的云端硬盘文档。

希望它有用。