使用FileReader和JSZip.js在浏览器中打开zip文件

时间:2016-06-17 07:52:28

标签: javascript filereader jszip

我尝试使用FileReader和JSZip.js在浏览器中打开zip文件,然后处理其中包含的文件。我无法弄清楚如何正确地将FileReader对象传递给JSZip。

这是我用来加载javascript的页面的剥离版本:

<!DOCTYPE html>
<html>
<head>

<meta charset="UTF-8" />

<script type="text/javascript" src="zipscan.js"></script>
<script type="text/javascript" src="jszip.js"></script>
<script type="text/javascript" src="jquery-1.8.3.min.js"></script>

</head>
<body>

<div id="openFile"><input type="file" id="inputFile" /></div>

</body>
</html>

删除所有不必要的代码后,zipscan.js中的javascript:

function checkFiles()
{ 
    //Check support for the File API support 
    if ( window.File && window.FileReader && window.FileList && window.Blob )
    {
        var fileSelected = document.getElementById( "inputFile" );
        fileSelected.addEventListener( "change", handleFile, false );
    } 
    else
    { 
        alert( "Files are not supported" ); 
    } 
}


function handleFile( evt )
{
    //Set wanted file object 
    var fileToRead = evt.target.files[0];

    //Create fileReader object
    var fileReader = new FileReader(); 
    fileReader.onload = function ( e )
    {
        //Create JSZip instance
        var archive = new JSZip().loadAsync( e.target );

        //Testing that it is loaded correctly
        alert( e.target );
        alert( archive.file( "hello.txt" ).name );
    } 
    fileReader.readAsArrayBuffer( fileToRead );
}

window.addEventListener( "load", checkFiles, false );

第一个警告显示[object FileReader],第二个警告显示TypeError,archive.file(...)为null。

我已经使用FileReader的readAsText方法使用相同的代码成功打开文本文件,因此如果出现错误,则使用readAsArrayBuffer(JSZip文档建议)或者使用#&# 39;使用它。几乎所有关于JSZip的资源都使用了带有构造函数参数的旧方法而不是loadAsync,所以我可能没有正确使用它。

1 个答案:

答案 0 :(得分:5)

您可以直接传递File对象,而无需通过FileReaderFile对象本身是(扩展的)Blob,JSZip可以将其作为loadAsync()的参数。

工作示例

&#13;
&#13;
f.onchange = function() {
  var zip = new JSZip();
  zip.loadAsync( this.files[0] /* = file blob */)
     .then(function(zip) {
         // process ZIP file content here
         alert("OK")
     }, function() {alert("Not a valid zip file")}); 
};
&#13;
<script src="https://raw.githubusercontent.com/Stuk/jszip/master/dist/jszip.min.js">
</script>
<input type=file id=f>
&#13;
&#13;
&#13;