मैंने जावास्क्रिप्ट में एक अनजापर लिखा था। यह काम करता हैं।
यह एंडी जीपी ना के बाइनरी फाइल रीडर पर निर्भर करता है और कुछ RFC1951 नोटमास्टरेट से तर्क को बढ़ाता है । मैंने ZipFile क्लास जोड़ी।
काम करने का उदाहरण:
http://cheeso.members.winisp.net/Unzip-Example.htm (मृत लिंक)
स्रोत:
http://cheeso.members.winisp.net/srcview.aspx?dir=js-unzip (मृत लिंक)
NB : लिंक मर चुके हैं; मुझे जल्द ही एक नया मेजबान मिलेगा।
स्रोत में शामिल एक ZipFile.htm प्रदर्शन पृष्ठ है, और 3 अलग-अलग स्क्रिप्ट, एक जिप्फ़िले वर्ग के लिए, एक फुलाया वर्ग के लिए, और एक द्विआधारी फ़ाइल रीडर वर्ग के लिए। डेमो jQuery और jQuery UI पर भी निर्भर करता है। यदि आप बस js-zip.zip फ़ाइल डाउनलोड करते हैं, तो सभी आवश्यक स्रोत हैं।
यहाँ जावास्क्रिप्ट में एप्लिकेशन कोड कैसा दिखता है:
var readFile = function(){
$("#status").html("<br/>");
var url= $("#urlToLoad").val();
var doneReading = function(zip){
extractEntries(zip);
};
var zipFile = new ZipFile(url, doneReading);
};
function extractEntries(zip){
$('#report').accordion('destroy');
$("#report").html('');
var extractCb = function(id) {
return (function(entryName, entryText){
var content = entryText.replace(new RegExp( "\\n", "g" ), "<br/>");
$("#"+id).html(content);
$("#status").append("extract cb, entry(" + entryName + ") id(" + id + ")<br/>");
$('#report').accordion('destroy');
$('#report').accordion({collapsible:true, active:false});
});
}
for (var i=0; i<zip.entries.length; i++) {
var entry = zip.entries[i];
var entryInfo = "<h4><a>" + entry.name + "</a></h4>\n<div>";
var randomId = "id-"+ Math.floor((Math.random() * 1000000000));
entryInfo += "<span class='inputDiv'><h4>Content:</h4><span id='" + randomId +
"'></span></span></div>\n";
$("#report").append(entryInfo);
entry.extract(extractCb(randomId));
}
}
डेमो कुछ चरणों में काम करता है: readFile
fn एक क्लिक से चालू हो जाता है, और एक ZipFile ऑब्जेक्ट को इंस्टेंट करता है, जो ज़िप फ़ाइल को पढ़ता है। जब रीड पूरा हो जाता है (आमतौर पर यथोचित आकार के ज़िप के लिए एक सेकंड से भी कम समय में होता है) के लिए एक अतुल्यकालिक कॉलबैक है - इस डेमो में कॉलबैक को स्थानीय स्थानीय चर में आयोजित किया जाता है, जो बस कॉल करता है extractEntries
, जो प्रदान की गई सभी सामग्री को नेत्रहीन रूप से खोल देता है। ज़िप फ़ाइल। एक वास्तविक ऐप में आप संभवतः कुछ प्रविष्टियों को निकालने के लिए चुनेंगे (उपयोगकर्ता को प्रोग्राम के अनुसार एक या एक से अधिक प्रविष्टियाँ चुनने की अनुमति दे सकते हैं, आदि)।
extractEntries
सभी प्रविष्टियों से अधिक fn दोहराता, और कॉल extract()
हर एक पर, एक कॉलबैक गुजर। एक प्रविष्टि के अपघटन में समय लगता है, शायद 1 या उससे अधिक के लिए प्रत्येक प्रविष्टि के लिए zipfile, जिसका अर्थ है अतुल्यकालिक उपयुक्त है। एक्सट्रेक्ट कॉलबैक केवल निकाले गए कंटेंट को पेज पर jQuery अकॉर्डियन में जोड़ता है। यदि सामग्री द्विआधारी है, तो यह इस तरह के रूप में स्वरूपित हो जाती है (दिखाई नहीं जाती)।
यह काम करता है, लेकिन मुझे लगता है कि उपयोगिता कुछ हद तक सीमित है।
एक बात के लिए: यह बहुत धीमा है। PKWare से 140k AppNote.txt फ़ाइल को अनज़िप करने के लिए ~ 4 सेकंड का समय लगता है। .NET प्रोग्राम में .5s से कम में वही अनकंप्रेस किया जा सकता है। संपादित करें : जावास्क्रिप्ट ZipFile अनपैक आईई 9 और क्रोम में अब इससे काफी तेज है। यह अभी भी संकलित कार्यक्रम की तुलना में धीमा है, लेकिन सामान्य ब्राउज़र उपयोग के लिए यह बहुत तेज़ है।
दूसरे के लिए: यह स्ट्रीमिंग नहीं करता है। यह मूल रूप से zipfile की संपूर्ण सामग्री को मेमोरी में स्लैप करता है। एक "वास्तविक" प्रोग्रामिंग वातावरण में आप केवल एक ज़िप फ़ाइल के मेटाडेटा (जैसे कि, 64 बाइट्स प्रति प्रविष्टि) में पढ़ सकते हैं और फिर वांछित के रूप में अन्य डेटा को पढ़ और विघटित कर सकते हैं। जावास्क्रिप्ट में उस तरह से IO करने का कोई तरीका नहीं है, जहां तक मुझे पता है, इसलिए एकमात्र विकल्प पूरे ज़िप को मेमोरी में पढ़ना और उसमें यादृच्छिक अभिगम करना है। इसका मतलब यह बड़ी ज़िप फ़ाइलों के लिए सिस्टम मेमोरी पर अनुचित मांगों को रखेगा। इतनी छोटी ज़िप फ़ाइल के लिए कोई समस्या नहीं है।
इसके अलावा: यह "सामान्य मामला" ज़िप फ़ाइल को हैंडल नहीं करता है - बहुत सारे ज़िप विकल्प हैं जो मैंने unzipper में लागू करने के लिए परेशान नहीं किया है - जैसे ज़िप एन्क्रिप्शन, WinZip एन्क्रिप्शन, zip64, UTF-8 एन्कोडेड फ़ाइल नाम, और इसी तरह पर। ( EDIT - यह अब UTF-8 एन्कोडेड फ़ाइल नाम संभालता है)। ZipFile क्लास मूल बातें संभालती है, हालाँकि। इनमें से कुछ चीजों को लागू करना कठिन नहीं होगा। मेरे पास जावास्क्रिप्ट में एईएस एन्क्रिप्शन क्लास है; कि एन्क्रिप्शन का समर्थन करने के लिए एकीकृत किया जा सकता है। Zip64 का समर्थन करना संभवतः जावास्क्रिप्ट के अधिकांश उपयोगकर्ताओं के लिए बेकार होगा, क्योंकि इसका समर्थन करने का इरादा है> 4gb zipfiles - एक ब्राउज़र में उन को निकालने की आवश्यकता नहीं है।
मैंने बाइनरी सामग्री को अनज़िप करने के लिए मामले का परीक्षण नहीं किया। अभी यह टेक्स्ट को अनज़िप करता है। यदि आपके पास ज़िप्ड बाइनरी फ़ाइल है, तो आपको इसे ठीक से संभालने के लिए ZipFile वर्ग को संपादित करना होगा। मुझे समझ नहीं आया कि सफाई से कैसे किया जाए। यह अब बाइनरी फाइलें भी करता है।
EDIT - मैंने JS अनज़िप लाइब्रेरी और डेमो को अपडेट किया। यह अब टेक्स्ट के अलावा बाइनरी फाइल करता है। मैंने इसे अधिक लचीला और अधिक सामान्य बना दिया है - पाठ फ़ाइलों को पढ़ते समय अब आप एन्कोडिंग का उपयोग करने के लिए निर्दिष्ट कर सकते हैं। इसके अलावा डेमो का विस्तार किया गया है - यह अन्य चीजों के अलावा, ब्राउज़र में एक XLSX फ़ाइल को खोलना दिखाता है।
इसलिए, जबकि मुझे लगता है कि यह सीमित उपयोगिता और रुचि का है, यह काम करता है। मुझे लगता है कि यह Node.js. में काम करेगा