Как загрузить PDF в большой двоичный объект, чтобы его можно было загрузить?

Я работаю над тестовой средой, которая должна передавать файлы прослушивателю падения экземпляра PLUpload. Мне нужно создать объекты blob для передачи внутри объекта передачи данных типа, сгенерированного в событии Drag/Drop. У меня он отлично работает для текстовых файлов и файлов изображений. Я хотел бы добавить поддержку PDF, но кажется, что я не могу получить кодировку сразу после получения ответа. Ответ возвращается в виде текста, потому что я использую Sahi для его получения, чтобы избежать междоменных проблем.

Вкратце: строка, которую я получаю, имеет кодировку UTF-8, и поэтому содержимое выглядит так, как будто вы открыли PDF-файл в текстовом редакторе. Мне интересно, как преобразовать это обратно в необходимый формат для создания большого двоичного объекта, чтобы после загрузки документа все выглядело нормально.

Какие шаги мне нужно выполнить, чтобы преобразовать строку UTF-8 в правильный объект большого двоичного объекта? (Да, я знаю, что мог бы отправить запрос XHR и изменить свойство responseType и (возможно) приблизиться, однако из-за сложностей с тем, как работает Сахи, я не собираюсь объяснять здесь, почему я предпочел бы не идти по этому пути. ).

Кроме того, я недостаточно знаком, но у меня есть предчувствие, что, возможно, я потеряю данные, извлекая их в виде строки? Если это так, я найду другой подход.

Существующий код и самый последний подход, который я пробовал, находится здесь:

    var data = '%PDF-1.7%����115 0 obj<</Linearized 1/L ...'
    var arr = [];
    var utf8 = unescape(encodeURIComponent(data));
    for (var i = 0; i < utf8.length; i++) {
        arr.push(utf8.charCodeAt(i));
    }

    var file = new Blob(arr, {type: 'application/pdf'});

person RutledgePaulV    schedule 09.09.2014    source источник
comment
xhr.responseType=blob; ...; файл = xhr.response;   -  person dandavis    schedule 09.09.2014
comment
вы пробовали новый Blob (данные, {тип: 'application/pdf'})?   -  person Luizgrs    schedule 09.09.2014
comment
Я пробовал это. Я почти уверен, что тоже пробовал решение @dandavis, но попробую еще раз, когда у меня будет несколько минут.   -  person RutledgePaulV    schedule 10.09.2014
comment
см. 2-й и 3-й примеры на developer.mozilla.org/en -US/docs/Web/API/XMLHttpRequest/ вы имитируете старый способ выполнения двоичного ajax в опубликованном коде, но начиная с IE8 в этом нет необходимости.   -  person dandavis    schedule 10.09.2014


Ответы (1)


Похоже, вы были рядом. Я только что сделал это для сайта, которому нужно было прочитать PDF-файл с другого сайта и поместить его в плагин для загрузки файлов. Вот что сработало для меня:

    var url = "http://some-websites.com/Pdf/";

    //You may not need this part if you have the PDF data locally already
    var xhr = new XMLHttpRequest();
    xhr.onreadystatechange = function () {
        if (this.readyState == 4 && this.status == 200) {
            //console.log(this.response, typeof this.response);
            //now convert your Blob from the response into a File and give it a name
            var fileOfBlob = new File([this.response], 'your_file.pdf');

            // Now do something with the File
            // for filuploader (blueimp), just use the add method
            $('#fileupload').fileupload('add', {
                files: [ fileOfBlob ], 
                fileInput: $(this)
            });
        }
    }
    xhr.open('GET', url);
    xhr.responseType = 'blob';
    xhr.send();  

Я нашел справку по XHR в виде большого двоичного объекта здесь. Затем этот ответ SO помог мне назвать файл. Возможно, вы сможете использовать Blob отдельно, но вы не сможете дать ему имя, если оно не будет передано в File.

person shanabus    schedule 19.08.2017