Sube un archivo a Google Drive API usando HTML5

Estoy creando una extensión de Google Chrome que utiliza la API de Google Drive. Tengo que subir un archivo con HTML5.

Para archivos de texto, no hay problema. Pero cuando quiero subir un archivo binario, siempre hay errores.

Entonces, cuando subo un archivo usando FileReader en HTML5 como BinaryString, mi imagen está dañada, no puedo leerlo.

Y cuando uso la codificación Base64 (con el encabezado en la parte del cuerpo "Content-Transfer-Encoding: base64"), tengo una Solicitud incorrecta 400 -> Cuerpo de varias partes con formato incorrecto.

Puedes ayudarme por favor ? Gracias :)

PD: no quiero usar el SDK de Google Drive, prefiero escribir todo el código.

var bb, reader;

var meta = {
"title": "mozilla.png",
"mimeType": "image/png",
"description": "Mozilla Official logo"
};

var xhr = new XMLHttpRequest();
xhr.open('GET', 'https://developer.mozilla.org/media/img/mdn-logo-sm.png', true);
xhr.responseType = 'arraybuffer';

xhr.onload = function(e){
if(this.status == 200){
    bb = new WebKitBlobBuilder();
    bb.append(this.response);
    console.log('Download OK');

    reader = new FileReader();
    reader.readAsDataURL(bb.getBlob('image/png'));
    reader.onloadend = function(e){
        console.log('Reader OK');

        var bound = 287032396531387;

        var parts = [];
        parts.push('--' + bound);
        parts.push('Content-Type: application/json');
        parts.push('');
        parts.push(JSON.stringify(meta));
        parts.push('--' + bound);
        parts.push('Content-Type: image/png');
        parts.push('Content-Transfer-Encoding: base64');
        parts.push('');
        parts.push(reader.result);
        parts.push('--' + bound + '--');

        var xhr = new XMLHttpRequest();
        xhr.open("POST", "https://www.googleapis.com/upload/drive/v2/files?uploadType=multipart", true);
        xhr.setRequestHeader("Authorization", "Bearer token123456");
        xhr.setRequestHeader("Content-Type", "multipart/mixed; boundary=" + bound);


        xhr.onload = function(e){
            console.log("DRIVE OK", this, e);
        };

        xhr.send(parts.join("\r\n"));
    }
}
};

xhr.send();

Para Binary Upload, solo modifica esta línea:

reader.readAsDataURL(bb.getBlob('image/png'));

por ese

reader.readAsBinaryString(bb.getBlob('image/png'));

y borra esta línea:

parts.push('Content-Transfer-Encoding: base64');

Intenté crear un archivo enviando primero los metadatos y cargando el contenido después, como en esteenviar y siempre recibo un error 404 al cargar el contenido, pero esta es otra historia ...

Respuestas a la pregunta(1)

Su respuesta a la pregunta