Загрузите файл в Google Drive API, используя HTML5

Я создаю расширение Google Chrome, которое использует Google Drive API. Я должен загрузить файл с HTML5.

Для текстовых файлов проблем нет. Но когда я хочу загрузить двоичный файл, всегда возникают ошибки.

Поэтому, когда я загружаю файл с использованием FileReader в HTML5 как BinaryString, мое изображение повреждено, я не могу его прочитать.

И когда я использую кодировку Base64 (с заголовком в части тела "Content-Transfer-Encoding: base64"), у меня 400 неверных запросов - & gt; Деформированное многочастное тело.

Не могли бы вы мне помочь ? Спасибо :)

PS: я не хочу использовать Google Drive SDK, я предпочитаю писать весь код.

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();

Для двоичной загрузки просто измените эту строку:

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

тем

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

и удалите эту строку:

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

Я попытался создать файл, отправив сначала метаданные, а затем загрузить содержимое, как в этомсообщение и я всегда получаю ошибку 404 для загрузки контента, но это другая история ...

Ответы на вопрос(1)

Ваш ответ на вопрос