Может ли Webkit JavaScript PUT или POST использовать REST-стиль изображения как чистый двоичный файл? - PullRequest
7 голосов
/ 28 декабря 2011

Когда мой браузер загружает изображение с веб-сайта, кодировка base64 не используется. Он выдает команду HTTP, такую ​​как GET /image.jpg, и получает ответ HTTP, чей Content-Type является чем-то вроде image/jpg, чей Content-Length - это число байтов в изображении, а тело - это сами необработанные двоичные данные изображения. Данные не кодируются с использованием набора символов и не кодируются с использованием схемы, подобной base64.

Написание ресурсов RESTful научило меня ожидать симметрии между HTTP GET и PUT, так что, например, URL, который доставляет данные JSON при выполнении GET, будет принимать данные JSON, когда они представлены с PUT. Ни в том, ни в другом случае не используется кодирование формы; в обоих случаях просто есть Content-Length, дающий количество байтов в полезной нагрузке, заголовок Content-Type, объявляющий, что полезная нагрузка является JSON в некотором наборе символов, и затем символьные данные располагаются отдельно и не украшаются как тело GET или PUT.

Я пишу приложение PhoneGap, которое позволяет пользователям делать фотографии и загружать их с помощью моего приложения. Я ожидал, что смогу разработать для этого интерфейс RESTful, который поддерживает симметричные GET и PUT - так что команды PUT не требуют специального кодирования и не предполагают какого-либо представления набора символов, а просто имеют Content-Type из image/jpg, а затем масса двоичных данных JPG в качестве полезной нагрузки. Очевидно, что это более эффективное использование полосы пропускания, чем попытка кодировать изображение внутри формы. И этот подход прекрасно работает, когда я PUT на URL-адрес с помощью инструмента, как curl.

Но мне не повезло в выполнении чистого RESTful PUT из PhoneGap WebKit JavaScript! PhoneGap готов вернуть изображение в мой JavaScript-код как локальный URL-адрес file: или как URL-адрес data:, который содержит встроенные данные изображения в кодировке base64. Но ни в том, ни в другом случае я не могу найти ясный способ преобразовать изображение в чистый двоичный формат (я бы использовал один из этих новомодных Blob объектов для этого? Если да, то как?), А затем вызвал PUT, что без добавление запроса к дополнительным слоям формы или кодирования будет просто передавать необработанное изображение по проводам на мой веб-сервер в качестве полезной нагрузки HTTP-запроса.

Кто-нибудь знает, как заставить WebKit PUT запрос AJAX с необработанным изображением в качестве тела? Спасибо за любые указатели - или даже любые полезные ответы о том, что я все это неправильно подхожу!

1 Ответ

2 голосов
/ 28 декабря 2011

Что касается обработки двоичных изображений, демонстрационный пример Binary File Inspector может быть полезен в качестве сквозного примера.

Есть некоторая учебная информация о том, как получить Blob s из файловой системы, по адресу MDN . В этом блоге описывается, как преобразовать URI-код base64 в ArrayBuffer, а затем Blob.

Наконец, ArrayBuffer или Blob могут быть загружены с использованием XMLHttpRequest2 интерфейса .

Спецификация XHR2, по-видимому, подразумевает , что поддерживается PUT, наряду с кучей других HTTP-методов. Таким образом, комбинируя все это, вы можете заполнить файлы за Blob с и отправить их с помощью XHR2.


Пример непроверенного кода с использованием метода декодирования base64 с некоторой помощью из base64-binary.js :

var BASE_64_PREFIX = "base64,";
function getBase64Content(base64Uri) {
   var index = base64Uri.indexOf(BASE_64_PREFIX);
   return base64Uri.substring(index + BASE_64_PREFIX.length);
}

function put(uri, data, onComplete) {
    var xhr = new XMLHttpRequest();
    xhr.open("PUT", uri, true);
    xhr.onload = onComplete;

    xhr.send(data);
}

var base64Uri = fromPhoneGap();
var base64Content = getBase64Content(base64Uri);
var arrayBuffer = Base64Binary.decodeArrayBuffer(base64Content);

put("/some/uri", arrayBuffer, function () {
    console.log("All done");
});

Тем не менее, я сомневаюсь, что многое из этого работает даже на последнем настольном WebKit, тем более на той версии, с которой вы собираетесь работать через PhoneGap. Вы, вероятно, не в хорошей форме, чтобы воспользоваться этими черновыми спецификациями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...