大津です。
zlib の Unzip って、 gzip か deflate かを自動的に判別して解凍する
メソッドで、zip ファイルエンコーディングされたものを扱うわけじゃ
ないんですよね。紛らわしいので注意が必要です。
setTimeoutの件は、時間をとって悩みたいということなので解答は書きませんが、
おそらくOSのファイルバッファにまだたまっていてディスクへの書き込みが完了
してからでないでしょう。
fs のマニュアルをよく読んで解決策を探してみましょう。
またメモリを使っていいなら、わざわざファイルに書き出さず
Buffer使って zip 展開できます。
https://gist.github.com/shigeki/01814e5e771c00a82a97
これなら(多少速いし)setTimeout に悩まなくてすみますよ。
(2014/02/24 16:29), meganetops wrote:
Hiroshi Kuwabara 様
ありがとうございます。
adm-zipで無事に解決できました!
最終的には下記のようなコードにしてみました。
|
var http = require("http");
var fs = require("fs");
var AdmZip = require('adm-zip');
var url = "http://ja.wordpress.org/latest-ja.zip";
var savedir = "./tmp"
var unzipdir = savedir+"/wp";
var zipdir = savedir+"/wordpres-latest.zip";
var output = fs.createWriteStream(zipdir);
var req = http.get(url,function(res){
res.pipe(output);
res.on("data",function(){
console.log("on-data・・・");
});
res.on("end",function(){
console.log("finish!!!!!!!!");
output.close();
});
});
output.on("close",function(){
console.log("close!!!!!!!!");
setTimeout(function(){
// setTimeoutでタイミングをずらさないと下記のエラー
//Invalid or unsupported zip format. No END header found
console.log("setTimeout!!!!!!!!");
var zip = new AdmZip(zipdir);
zip.extractAllTo(unzipdir,true);
},1000);
});
|
zipデータをダウンロードさせた後、すぐに解凍しようとするとエラーが出てしまったので、
setTimeoutで少しタイミングをずらしてみると回避できました(汗
きちんとした方法ではないと思いますのでまた時間をとって悩んでみたいと思います。
2014年2月24日月曜日 15時31分53秒 UTC+9 Hiroshi Kuwabara:
zlibモジュールでは直接ディレクトリの解凍はできまでんでしたね。
Streamインターフェースではないですが、adm-zipというモジュールだと解凍できました。
https://github.com/cthackers/adm-zip <https://github.com/cthackers/adm-zip>
On Saturday, February 22, 2014 6:09:45 PM UTC+9, meganetops wrote:
node組込みのzlibモジュールにチャンレンジしてみました。
http://nodejs.jp/nodejs.org_ja/docs/v0.10/api/zlib.html
<http://nodejs.jp/nodejs.org_ja/docs/v0.10/api/zlib.html>
サンプルにあったような1ファイルだけを圧縮、解凍は動かせる事はできましたが、
ディレクトリを圧縮したzipを解凍ができませんでした・・・。
下記のようなコードでためしてみています。
|
var fs = require('fs');
var zlib = require("zlib");
var un_zip = zlib.createUnzip();
var inp = fs.createReadStream("wordpress-3.8.1-ja.zip");
var out = fs.createWriteStream("tmp/wp");
inp.pipe(un_zip).pipe(out);
|
下記のエラーが出てうまくいきませんでした。
|
events.js:72
throw er; // Unhandled 'error' event
^
Error: incorrect header check
at Zlib._binding.onerror (zlib.js:295:17)
|
エラーをもとに昨日からググってみましたが、
クライアントサイドのJSとWordpressを触るのにPHPを少しやっている私レベルでは
ちょっと歯がたちません(汗
何かヒントをいただけませんでしょうか。
よろしくお願いいたします。
2014年2月21日金曜日 10時50分06秒 UTC+9 meganetops:
はじめまして。
私はNodeを少し触って遊んでみているWebデザイナーです。
WordPressをダウンロードしてzipを解凍するコードを書いて動かしてみたところ、
maximum call stack size exceeded エラーが出てしまいいきずまってしまいました。
環境は、
OS:Window7
Node: v.0.10.24
です。
あと、zipの展開には「node-unzip
<https://github.com/EvanOxfeld/node-unzip>」というものを使用させていただいております。
下記のコードで動かしてみているのですが何が原因となっていますでしょうか?
|
var http = require("http");
var fs = require("fs");
var unzip = require("unzip");
var url = "http://ja.wordpress.org/latest-ja.zip
<http://ja.wordpress.org/latest-ja.zip>";
var savedir = "./tmp"
var output = fs.createWriteStream(savedir+"/wordpres-latest.zip");
var req = http.get(url,function(res){
res.pipe(output);
res.on("data",function(){
console.log("on-data・・・");
});
res.on("end",function(){
console.log("finish!!!!!!!!");
output.close();
fs.createReadStream(savedir+"/wordpres-latest.zip")
.pipe(unzip.Extract({ path: savedir }))
.on('error', function (err) { console.log('error', err); })
.on('close', function () { console.log('closed'); });
});
});
|
zipの解凍はできているようで、
展開されたファイルは出てきています。
よろしくお願いいたします。
--
---
このメールは Google グループのグループ「Node.js 日本ユーザグループ」の登録者に送られています。
このグループから退会し、メールの受信を停止するには、nodejs_jp+unsubscr...@googlegroups.com にメールを送信します。
その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。
--
---
このメールは Google グループのグループ「Node.js 日本ユーザグループ」の登録者に送られています。
このグループから退会し、メールの受信を停止するには、nodejs_jp+unsubscr...@googlegroups.com にメールを送信します。
その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。