У меня есть приложение Ionic, которое загружает файл из веб-API.Содержимое файла можно найти в свойстве _body
ответа HTTP.
Я пытаюсь преобразовать этотекст в 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);
дает.Потому что файлы, с которыми я работаю, или данные, которые я извлекаю из моего бэкэнда, - это текстовая форма.