Javascript в плагине Safari - загрузите данные двоичного файла из XHR, а затем повторно отправьте - PullRequest
2 голосов
/ 10 августа 2011

Я пытаюсь написать расширение Safari, чтобы захватить PDF-документ, который пользователь открыл, и затем отправить его на другой сайт через POST.

Я сделал эту работу в Chrome, но копирование того же метода не работает, потому что Safari не работает с BlobBuilder.

Вот что работает в Chrome:

    var xhr = new XMLHttpRequest();
    xhr.open("GET", tab.url, true);

    xhr.responseType = "arraybuffer";

    xhr.onreadystatechange = function() {
      if (xhr.readyState == 4 && xhr.status == 200)  {

            var bb = new BlobBuilder();
            bb.append(this.response); 

            var blob = bb.getBlob('application/pdf');

            var http = new XMLHttpRequest();

            http.open("POST", send_url, true);

            var formData = new FormData();
            formData.append("src", blob);
            http.send(formData);
        }

В результате POST обращается к моему PHP-скрипту, а в его массиве $ _FILES - мой файл.Отлично.

Но абсолютно ничего, что я пробую, похоже, не работает с Safari.Я пытался начать с responseType='blob', но это не сработало.Я не могу заставить ни один из файловых объектов Safari JS работать с этими данными.Я попытался изменить его на массив Uint8, но данные не были отправлены, только строка, в которой говорилось: "[object UInt8Array]"

Есть идеи?

Приветствия!Tony

1 Ответ

2 голосов
/ 30 октября 2011

Я получил отличные результаты, сохранив responseType как 'arraybuffer', а затем передав xhr.response в конструктор нового Uint8Array, отлично работал в Safari 5.1.1 на моем Mac:

xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
    if (xhr.readyState == 4) {
        buffer = new Uint8Array(xhr.response);
        for (var loop=0; loop<buffer.length; loop++) {
            // Do something with buffer[loop]
        }
    }
}
xhr.open('GET', 'yourfilename.here', true);
xhr.responseType = 'arraybuffer';
xhr.send();

Должен признать, что я попробовал «одну или две» вещи, прежде чем включился режим RTFM, и обнаружил, что на странице MDN в XMLHttpRequest есть раздел по чтению двоичных данных (MDN - отличный ресурс).

Как только я поставил это на место, все стало работать фантастически.

Dan

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