2017-05-11 3 views
0

大きなzipファイルを(圧縮せずにファイルを保存するだけで)オンザフライで生成し、restify経由でストリーミングしようとしています。 zipファイルは合計で4 GiBを超えることがあり、MacOSで正しくサポートされていないと思われるZIP64形式のファイルを発行しました。MacOSアーカイブユーティリティで開くことができる4 GiBより大きいzipアーカイブを作成する

node-archiveryazlを使ってみましたが、両方ともzipファイルを生成できますが、MacOSのネイティブグラフィカルユーティリティ(Finderでファイルをダブルクリックするなど)で開くことができません。これに関する最も奇妙なことは、ネイティブのunzipコマンドラインユーティリティがここでうまくいきます。グラフィカルアーカイブユーティリティだけが動作していないことです。

また、単純なJava実装を使用してzipを作成しようとしましたが、グラフィカルアーカイブユーティリティでも結果ファイルが正常に機能するため、問題はおそらくnode-archiver/yazlライブラリの実装にあります。また、コマンドライン(zip file.zip -0 ...files)でジップを作成しようとしましたが、アーカイブユーティリティを使用して開くこともできます。

この状況を処理する正しい方法は何ですか? Archive Utilityで開くことができるZIP64形式を生成できる他のノードライブラリはありますか?

zipファイルをディスクにストリーミングする必要はありません。私は最新バージョンのMacOS sierra(10.12.5 beta)とノード6.9.1を実行しています。

答えて

0

誰もが私と同じ要件で苦労したら、JSZipライブラリ(https://stuk.github.io/jszip/)をチェックしてください。また、ノードストリームでも動作し、4 GiB以上のzipファイルを生成することができます。これは、MacOS Archive Utilityで開くことができます。これの唯一の制限は、32ビットCRC32ハッシュ生成のため(ただし、zipファイルは大きくなる可能性がある)、4 GiBより大きいファイルを持つことができないということです。ここで

は、あなたがこのライブラリを使用する方法の抜粋です:

const fs = require('fs'); 
const JSZip = require('jszip'); 

const files = [...]; 
const zip = new JSZip(); 

for (const file of files) { 
    zip.file(file.name, fs.createReadStream(file.path)); 
} 

res.header('Content-Type', 'application/zip'); 
res.header('Content-Disposition', `attachment; filename="${encodeURI(`test.zip`)}"`); 
zip.generateNodeStream({streamFiles: true, compression: 'STORE'}).pipe(res); 
関連する問題