需求:在網頁端上傳壓縮文件,同時壓縮文件中包含了一個txt的說明文件,需要在前端顯示出來。
主要依靠jszip實現,官網https://stuk.github.io/jszip/
js引用:https://www.bootcdn.cn/jszip/#about
主要的問題解決:亂碼。。。。。
效果圖:
我引用了的js <script src="https://cdn.bootcdn.net/ajax/libs/jszip/3.3.0/jszip.js"></script>
核心代碼:
jszip官網給的例子:
JSZip.loadAsync(f).then(function(zip) { zip.files['info.txt'].async("string").then(function(con){ console.log(con); }) }, function (e) { $result.append($("<div>", { "class" : "alert alert-danger", text : "Error reading " + f.name + ": " + e.message })); });
我修改的代碼:
JSZip.loadAsync(f).then(function(zip) { …… zip.files['info.txt'].async('blob').then(function(blob) { readTextAs(blob, "gbk", function (error, text) { $("#result").html(text) }); }) }, function (e) { $result.append($("<div>", { "class" : "alert alert-danger", text : "Error reading " + f.name + ": " + e.message })); }); function readTextAs(arrayBuffer, encoding, callback) { var reader = new FileReader(); var blob = new Blob([arrayBuffer]); reader.onload = function (evt) { callback(null, evt.target.result); }; reader.onerror = function (evt) { callback(evt.error, null); }; reader.readAsText(blob, encoding); }
再上傳一個完整版代碼吧
<!DOCTYPE html> <html> <head> <title>read zip</title> <meta charset="utf-8"> <script src="https://cdn.bootcdn.net/ajax/libs/jszip/3.3.0/jszip.js"></script> <!-- <script src="https://cdn.bootcdn.net/ajax/libs/jszip/2.6.1/jszip.js"></script> --> <script src="jquery-3.4.1.min.js"></script> </head> <body> <h3>選擇一個壓縮文件</h3> <input type="file" id="file" name="file" multiple /><br /> <div id="result_block" class="hidden"> <h3>文件內容 :</h3> <div id="result"> </div> </div> <script type="text/javascript"> $("#file").on("change", function(evt) { $("#result").html(""); $("#result_block").removeClass("hidden").addClass("show"); var files = evt.target.files; for (var i = 0; i < files.length; i++) { handleFile(files[i]); } }) function handleFile(f) { //顯示Zip名和創建filesname的ul容器 var $title = $("<h4>", { text : f.name }); var $fileContent = $("<ul>"); $("#result").append($title); $("#result").append($fileContent); // 1) read the Blob JSZip.loadAsync(f).then(function(zip) { // var dateAfter = new Date(); // $title.append($("<span>", { // "class": "small", // text:" (loaded in " + (dateAfter - dateBefore) + "ms)" // })); zip.files['info.txt'].async('blob').then(function(blob) { readTextAs(blob, "gbk", function (error, text) { $("#result").html(text) }); }) // zip.files['info.txt'].async("string").then(function(con){ // console.log(con); // console.log(str); // }) }, function (e) { $result.append($("<div>", { "class" : "alert alert-danger", text : "Error reading " + f.name + ": " + e.message })); }); } function readTextAs(arrayBuffer, encoding, callback) { var reader = new FileReader(); // EDIT : see my other comment below // var blob = JSZip.utils.arrayBuffer2Blob(arrayBuffer); var blob = new Blob([arrayBuffer]); reader.onload = function (evt) { callback(null, evt.target.result); }; reader.onerror = function (evt) { callback(evt.error, null); }; reader.readAsText(blob, encoding); } </script> </body> </html>