XMLHttpRequest: составной / связанный POST с XML и изображением в качестве полезной нагрузки

Я пытаюсь отправить изображение (с метаданными) в Picasa Webalbums из расширения Chrome. Обратите внимание, что обычный пост с Content-Type image / xyz работает, как я описал здесь . Тем не менее, я хочу включить описание / ключевые слова, а спецификация протокола описывает составной / связанный формат с XML и частью данных.

Я получаю данные через HTML5 FileReader и пользовательский файл. Я получаю двоичную строку , используя

FileReader.readAsBinaryString(file);

Предположим, это мой код обратного вызова, как только FileReader загрузит строку:

function upload_to_album(binaryString, filetype, albumid) {

    var method = 'POST';
    var url = 'http://picasaweb.google.com/data/feed/api/user/default/albumid/' + albumid;
    var request = gen_multipart('Title', 'Description', binaryString, filetype);
    var xhr = new XMLHttpRequest();
    xhr.open(method, url, true);
    xhr.setRequestHeader("GData-Version", '3.0');
    xhr.setRequestHeader("Content-Type",  'multipart/related; boundary="END_OF_PART"');
    xhr.setRequestHeader("MIME-version", "1.0");
    // Add OAuth Token
    xhr.setRequestHeader("Authorization", oauth.getAuthorizationHeader(url, method, ''));
    xhr.onreadystatechange = function(data) {
        if (xhr.readyState == 4) {
            // .. handle response
        }
    };
    xhr.send(request);
}   

Функция gen_multipart просто генерирует multipart из входных значений и шаблона XML и производит точный тот же результат , что и спецификация (кроме .. двоичных данных изображения ..), но для полноты, вот он:

function gen_multipart(title, description, image, mimetype) {
    var multipart = ['Media multipart posting', "   \n", '--END_OF_PART', "\n",
    'Content-Type: application/atom+xml',"\n","\n",
    "", '', title, '',
    '', description, '',
    '',
    '', "\n", '--END_OF_PART', "\n",
    'Content-Type:', mimetype, "\n\n",
    image, "\n", '--END_OF_PART--'];
    return multipart.join("");
}

Проблема в том, что полезная нагрузка POST отличается от необработанных данных изображения , и, таким образом, приводит к неверному запросу (Picasa не принимает изображение), хотя при использовании

xhr.send(file) // With content-type set to file.type

он работал нормально. Мой вопрос: как мне получить реальное двоичное изображение, чтобы включить его в составной? Я предполагаю, что это искажено, просто добавив его в строку xml, но я не могу исправить это.

Обратите внимание, что из-за старой ошибки в Picasa base64 не является решением.

12
задан Community 23 May 2017 в 12:16
поделиться