Конвертировать _body content (string) в arrayBuffer - PullRequest
0 голосов
/ 14 апреля 2019

У меня есть приложение Ionic, которое загружает файл из веб-API.Содержимое файла можно найти в свойстве _body ответа HTTP.

enter image description here

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

Однако проблема, с которой я сталкиваюсь, заключается в том, что любой файл (файлы PDF в моем случае), который имеет изображения и / или большие вsize либо не отображаются вообще, либо отображаются в виде исправленных файлов.

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

HTML:

<input type="file" id="file_input" class="foo" />
<div id="output_field" class="foo"></div>

JS:

$(document).ready(function(){
    $('#file_input').on('change', function(e){
        readFile(this.files[0], function(e) {
            //manipulate with result...
            $('#output_field').text(e.target.result);
            try {
            var file = new Blob([e.target.result], { type: 'application/pdf;base64' });
            var fileURL = window.URL.createObjectURL(file);
            var seconds = new Date().getTime() / 1000;
            var fileName = "cert" + parseInt(seconds) + ".pdf";
            var a = document.createElement("a");
            document.body.appendChild(a);
            a.style = "display: none";
            a.href = fileURL;
            a.download = fileName;
            a.click();
            }
            catch (err){
            $('#output_field').text(err);
            }
        });

    });
});

function readFile(file, callback){
    var reader = new FileReader();
    reader.onload = callback
    //reader.readAsArrayBuffer(file);
    reader.readAsText(file);
}

https://jsfiddle.net/68qeau3h/3/

Теперь при использовании reader.readAsArrayBuffer(file); все работает, как и ожидалось, однако в моем конкретном случае я использовал reader.readAsText(file);, потому что для меня это то, как данные извлекаются, это текстовая форма.

При добавлении этих строк кода, чтобы попытаться преобразовать строку в arrayBuffer

...
var buf = new ArrayBuffer(e.target.result.length * 2); // 2 bytes for each char
             var bufView = new Uint16Array(buf);
             for (var i=0, strLen=e.target.result.length; i<strLen; i++) {
               bufView[i] = e.target.result.charCodeAt(i);
                  }

            var file = new Blob([buf], { type: 'application/pdf' });
...

Это не будет работать и генерировать файлы PDF, которые браузер не может открыть.

Итак, резюмируем,то, что я пытаюсь сделать, это каким-то образом преобразовать полученный из reader.readAsText(file); результат в то, что reader.readAsArrayBuffer(file); дает.Потому что файлы, с которыми я работаю, или данные, которые я извлекаю из моего бэкэнда, - это текстовая форма.

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