【发布时间】:2019-09-18 11:17:05
【问题描述】:
我正在使用FileReader api 将文件输入的内容加载到浏览器的内存中。这个 jsfiddle 包括一个工作示例:
https://jsfiddle.net/qyh1s60d/
我把结果变成一个 Uint8Array 并显示在一个 div 中:
<label for="file-pdf">select a pdf:</label>
<input type="file" id="file-pdf" name="files[]" />
<div id="result-pdf">
</div>
JS
document.getElementById('file-pdf').addEventListener('change', handlePdfSelect, false);
function handlePdfSelect(evt) {
var files = evt.target.files; // FileList object
var reader = new FileReader();
reader.onload = (e)=>{
var res = new Uint8Array(e.target.result);
resultPdf.innerHTML = res.slice(0, 5)
}
reader.readAsArrayBuffer(files[0]);
}
到目前为止一切顺利。 div 会按预期显示一个数字数组。
接下来我想使用 JSZip 来获取位于 zip 文件中的相同 pdf。这是html:
label for="file-zip">select a zip:</label>
<input type="file" id="file-zip" name="files[]" />
<div id="result-zip">
</div>
还有 JS
document.getElementById('file-zip').addEventListener('change', handleZipSelect, false);
function handleZipSelect(evt) {
var files = evt.target.files; // FileList object
var reader = new FileReader();
reader.onload = (e)=>{
var res = new Uint8Array(e.target.result);
JSZip.loadAsync(res).then(function(data){
var pdfs = []
Object.keys(data['files']).forEach(f => {
if(/\.pdf$/.test(f)){
pdfs.push(data['files'][f])
}
})
var pdfcontents = pdfs[0]['_data']['compressedContent'].slice(0, 5)
resultZip.innerHTML = pdfcontents;
})
}
reader.readAsArrayBuffer(files[0]);
}
尽管我在这两个文件上传中使用了相同的 pdf,但我在浏览器中显示了不同的 Uint8Arrays。谁能告诉我为什么这些不同,以及如何使从 zip 文件中获取的 pdf 数据看起来与直接上传为 pdf 时相同?
【问题讨论】:
标签: javascript zip compression filereader jszip