PhoneGap的/科尔多瓦上传图片到graph.facebook - 需要上传文件上传图片、科尔、上传文件、多瓦

由网友(荒凉无人知)分享简介:我使用的是Facebook的图形API的版本V2.0和我试图上传图片至v2.0 / ME /照片,但不幸的是我得到这个错误(#324)要求上传文件,这很奇怪,因为我有publish_actions权限和文件说,这是所有我需要的。 I am using the v2.0 version of the facebook...

我使用的是Facebook的图形API的版本V2.0和我试图上传图片至v2.0 / ME /照片,但不幸的是我得到这个错误(#324)要求上传文件,这很奇怪,因为我有publish_actions权限和文件说,这是所有我需要的。

I am using the v2.0 version of the facebook graph api and I am trying to upload a picture to v2.0/me/photos, but unfortunately I get this error (#324) Requires upload file, which is strange, because I have publish_actions permission and the documentation says this is all I need.

我使用PhoneGap的,因此正常的JS SDK不为我工作和科尔多瓦,Facebook的插件使得科尔多瓦失败,它的建立(后面的指令中的至少5论坛/博客,没有什么工作),这就是为什么我是采用纯XMLHTT prequests和AJAX请求我的申请。一切工作正常(我发布一条消息给用户的墙,登录就好了),除了这图片上传。这是我使用(数据是图像的URI)功能:

I am using phonegap, therefore the normal JS SDK doesn't work for me and the cordova-facebook-plugin makes cordova to fail it's build (followed instructions on at least 5 forums/blogs, nothing worked), that's why I am using pure XMLHTTPRequests and AJAX requests for my application. Everything works fine (I can post a message to user's wall, log in just fine), except for this image upload. This is the function I am using (data is URI of an image):

function postImage(data, message) {

    var imageData = data.replace('data:image/jpeg;base64,', ''),
        mimeType = 'image/jpg',
        authToken = tokenStore['acess.token'],
        filename = 'bikeDice_screenshot_' + Math.round((+(new Date()) + Math.random())),
        deferred = $q.defer();

    try {
        var blob = dataURItoBlob(imageData, mimeType);
    } catch (e) {
        alert(e);
    }

    var fd = new FormData();
    fd.append("access_token", authToken);
    fd.append("source", '%7B' + blob + '%7D');
    fd.append("message", message);
    fd.append("no_story", false);

    try {

        $.ajax({
            url: 'https://graph.facebook.com/v2.0/me/permissions?access_token=' + authToken,
            type: 'GET',
            success: function (data) {
                alert(JSON.stringify(data));
            },
            error: function (err) {
                alert(err);
            }
        });

        $.ajax({
            url: "https://graph.facebook.com/v2.0/me/photos?access_token=" + authToken,
            type: "POST",
            data: fd,
            processData: false,
            contentType: false,
            cache: false,
            success: function (data) {
                console.log("success " + data);

                deferred.resolve(data);
            },
            error: function (shr, status, data) {

                alert(JSON.stringify(shr));
                deferred.reject(data);
            },
            complete: function () {
                console.log("Ajax Complete");
            }
        });

    } catch (e) {
        alert('error in ajax request ');
        alert(JSON.stringify(e));
    }

    function dataURItoBlob(dataURI, mime) {
        // convert base64 to raw binary data held in a string
        // doesn't handle URLEncoded DataURIs

        var byteString = window.atob(dataURI);
        // separate out the mime component


        // write the bytes of the string to an ArrayBuffer
        //var ab = new ArrayBuffer(byteString.length);
        var ia = new Uint8Array(byteString.length);
        for (var i = 0; i < byteString.length; i++) {
            ia[i] = byteString.charCodeAt(i);
        }

        // write the ArrayBuffer to a blob, and you're done

        try {
            var blob = new Blob([ia], {
                type: mime
            });
        } catch (e) {
            try {
                window.BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder || window.MSBlobBuilder;

                if (e.name == 'TypeError' && window.BlobBuilder) {
                    var bb = new BlobBuilder();
                    bb.append([ia.buffer]);
                    var blob = bb.getBlob(mime);
                    var bb = new BlobBuilder();

                } else if (e.name == "InvalidStateError") {
                    // InvalidStateError (tested on FF13 WinXP)
                    var blob = new Blob([ia.buffer], {
                        type: mime
                    });
                } else {
                    alert('Blob constructor unsupported entirely! ');
                }

            } catch (e) {
                alert(e);
            }
        }

        return blob;
    }


    return deferred.promise
};

P.S:在智能手机,该脚本始终如果去这在try / catch块:

P.S.: On smartphone, the script always goes to this if in the try/catch block:

if (e.name == 'TypeError' && window.BlobBuilder) {
    var bb = new BlobBuilder();
    bb.append([ia.buffer]);
    var blob = bb.getBlob(mime);
    var bb = new BlobBuilder();

}

P.S.2:我尝试添加&放大器; upload_file =真来POST请求的URL,没有运气真的...; /

P.S.2: I tried adding &upload_file=true to the url of the post request, no luck really... ;/

推荐答案

这是我才发现,使用科尔多瓦文件传输的插件的解决方案,工作方式和数据URI的魅力:

This is the solution I found, using the cordova file-transfer plugin, works like a charm with data URI:

function postImage(fileURI, message) {

    var deferred = $q.defer();

    var win = function (r) {

        deferred.resolve(r);
    }

    var fail = function (error) {

        deferred.reject(error);
    }

    var options = new FileUploadOptions();
    options.fileKey = "file";
    options.fileName = 'name_of_photo_' + Math.round((+(new Date()) + Math.random()));
    options.mimeType = "image/jpg";

    var params = new Object();
    params.access_token = "your facebook access token ;)";
    params.message = message;
    params.no_story = false;

    options.params = params;

    var ft = new FileTransfer();
    ft.upload(fileURI, "https://graph.facebook.com/v2.0/me/photos", win, fail, options);

    return deferred.promise;
}

但首先,插件添加到科尔多瓦,使用科尔多瓦插件添加org.apache.cordova.file转移

阅读全文

相关推荐

最新文章