ブラウザでZIPファイル展開
単純な構造かつサイズの小さなZIPファイル向けに、ブラウザでファイルを展開するツールになります。
ファイルの処理はJavaScriptで行います。そのため利用端末やファイルサイズ、構造によっては動作が遅かったり、正常に動かない場合もあるかもしれません。ただ、データはサーバーには一切送信しませんのでその点においては安全です。余計な通信も発生しません。
ファイル一覧における/はフォルダ階層を示します。ブラウザからはフォルダ階層を反映した形のダウンロードができないので、ご自身でフォルダ階層を作成してください。複雑な階層構造の場合は7Zip等のツールを使ってOS経由で展開することをお勧めします。
展開後のファイル名が日本語だと文字化けします。 encoding.jsライブラリを利用させていただき、SJISの文字化けに対応しました。
サイズの大きなファイルや、ファイル数が多かったり複雑な構造の圧縮ファイルを処理するとブラウザがフリーズ等を起こすかもしれません。各自の責任で利用してください。
アプリはこちらにあります。
ライセンス情報
Vue.js Released under the MIT License Copyright ©
2014-2020 Evan You
zlib.js Released
under the MIT
License Copyright © 2012 imaya
文字コード変換encoding.jsCopyright (c) 2014-2019 Polygon Planet MIT-LICENSE
ブラウザZIP展開ツール Released under the MIT
License Copyright © 2020 なんぶ電子
ソースコード
ライセンス表示の通りVue.jsを利用して作成しています。またZIPファイルを展開するzlib.js:JavaScriptライブラリを利用しています。
zlib.jsの部分は当ページではコードを直接ページに記載していますが、ここでのソースのコードの紹介は割愛させていただいています。作者様のページをご確認ください。
encoding.jsはCDNで利用させていただいております。
HTML&Script
<div id="app">
<div>
<p>ZIPファイル</p>
<input type="file" v-on:change="makeList" accept="application/zip"><br>
</div>
<div><p>{{strErr}}</p></div>
<div>
<p>展開後のファイル一覧</p>
<ul style="list-style: none;">
<li v-for="(item, index) in targetFiles"><button v-on:click="download(index);">{{item}}</button></li>
</ul>
</div>
</div>
<script src="https://unpkg.com/vue"></script>
<script type="module">
var vuejs = new Vue({
el: "#app",
data:{
targetFiles: [],
rawDatas:[],
strErr:"",
},
methods: {
makeList: function(e) {
this.strErr = "処理中です...";
try {
let zipfile = e.target.files[0];
let fileReader = new FileReader();
//ファイルの読み込みが終了した際の処理を先に記述
fileReader.onload = function(evt) {
let buffer = evt.target.result;
let uint8Array = new Uint8Array(buffer);
let unzip = new Zlib.Unzip(uint8Array);
let tmpList = unzip.getFilenames();
vuejs.targetFiles = []
vuejs.rawDatas =[];
for (let i =0; i < tmpList.length; i++) {
//最後が/で終わっている場合はディレクトリ
if (tmpList[i].slice(-1)==='/') {
continue;
}
//vuejs.targetFiles.push(tmpList[i]);
//文字化け対応
vuejs.targetFiles.push(Encoding.convert(tmpList[i],"UNICODE","AUTO"));
let blob = new Blob([unzip.decompress(tmpList[i])],{type: "octet/stream"});
vuejs.rawDatas.push(blob);
}
vuejs.strErr = "対象ファイルをクリックするとダウンロードが始まります";
};
//読み込み
fileReader.readAsArrayBuffer(zipfile);
} catch(er) {
donothing
this.strErr = er;
console.log(er);
}
},
download: function(intIndex) {
let url = URL.createObjectURL(this.rawDatas[intIndex]);
var a = document.createElement("a");
document.body.appendChild(a);
a.style = "display: none";
a.href = url;
//フォルダ階層を除去して名前を渡す
a.download = this.targetFiles[intIndex].split('/').pop();
a.click();
URL.revokeObjectURL(url);
},
},
})
</script>
<script>
//zlib.js(JS ZIP展開ライブラリ)読み込み
</script>
<!--encoding.js(文字変換ライブラリ)読み込み(CDN)-->
ZIPファイル展開アプリ
ZIPファイル
メッセージ
{{strErr}}
展開後のファイル一覧