سؤال

اريد عرض مكتب مفتوح الملفات ، .odt و .odp في جانب العميل باستخدام متصفح الويب.

هذه الملفات هي ملفات مضغوطة. باستخدام AJAX ، يمكنني الحصول على هذه الملفات من الخادم ولكن هذه ملفات مضغوطة. لا بد لي من فك ضغطهم باستخدام جافا سكريبت, ، لقد حاولت استخدام event.js ، http://www.onicos.com/staff/iz/amuse/javaScript/expert/inflate.txt, ، ولكن من دون نجاح.

كيف يمكنني أن أفعل هذا؟

هل كانت مفيدة؟

المحلول

كتبت unzipper في JavaScript. إنها تعمل.

يعتمد على قارئ الملف الثنائي لـ Andy GP NA و بعض RFC1951 تضخيم المنطق من Notmasteryet. أضفت فئة zipfile.

مثال العمل:
http://cheeso.members.winisp.net/unzip-example.htm (رابط ميت)

المصدر:
http://cheeso.members.winisp.net/srcview.aspx؟dir=js-unzip (رابط ميت)

NB: الروابط ميتة. سأجد مضيفًا جديدًا قريبًا.

تم تضمينه في المصدر صفحة عرض توضيحية zipfile.htm ، و 3 نصوص متميزة ، واحدة لفئة zipfile ، واحدة لفئة تضخيم ، وواحدة لفئة قارئ الملفات الثنائية. يعتمد العرض التوضيحي أيضًا على jQuery و jQuery UI. إذا قمت فقط بتنزيل ملف JS-Zip.zip ، فكل المصدر اللازم موجود.


إليك ما يبدو عليه رمز التطبيق في JavaScript:

// In my demo, this gets attached to a click event.
// it instantiates a ZipFile, and provides a callback that is
// invoked when the zip is read.  This can take a few seconds on a
// large zip file, so it's asynchronous. 
var readFile = function(){
    $("#status").html("<br/>");
    var url= $("#urlToLoad").val();
    var doneReading = function(zip){
        extractEntries(zip);
    };

    var zipFile = new ZipFile(url, doneReading);
};


// this function extracts the entries from an instantiated zip
function extractEntries(zip){
    $('#report').accordion('destroy');

    // clear
    $("#report").html('');

    var extractCb = function(id) {
        // this callback is invoked with the entry name, and entry text
        // in my demo, the text is just injected into an accordion panel.
        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 each entry in the zip, extract it. 
    for (var i=0; i<zip.entries.length;  i++) {
        var entry = zip.entries[i];

        var entryInfo = "<h4><a>" + entry.name + "</a></h4>\n<div>";

        // contrive an id for the entry, make it unique
        var randomId = "id-"+ Math.floor((Math.random() * 1000000000));

        entryInfo += "<span class='inputDiv'><h4>Content:</h4><span id='" + randomId +
            "'></span></span></div>\n";

        // insert the info for one entry as the last child within the report div
        $("#report").append(entryInfo);

        // extract asynchronously
        entry.extract(extractCb(randomId));
    }
}

يعمل العرض التوضيحي في خطوتين: readFile يتم تشغيل FN بنقرة ، ويستند إلى كائن zipfile ، الذي يقرأ ملف الرمز البريدي. هناك رد اتصال غير متزامن عند اكتمال القراءة (عادة ما يحدث في أقل من ثانية ل zips ذات الحجم المعقول) - في هذا العرض التوضيحي ، يتم استدعاء رد الاتصال في المتغير المحلي Donereading ، والذي يتصل ببساطة extractEntries, ، الذي يلفظ بشكل أعمى جميع محتوى ملف zip المقدم. في تطبيق حقيقي ، من المحتمل أن تختار بعض الإدخالات المراد استخراجها (اسمح للمستخدم بتحديد ، أو اختيار إدخالات واحدة أو أكثر برمجيًا ، إلخ).

ال extractEntries يتكرر FN على جميع الإدخالات ، والمكالمات extract() على كل واحد ، اجتياز رد الاتصال. يستغرق الضغط على الإدخال وقتًا ، ربما 1s أو أكثر لكل إدخال في Zipfile ، مما يعني أن عدم التزامن مناسب. يضيف رد الاتصال المستخلص ببساطة المحتوى المستخرج إلى أكورديون jQuery على الصفحة. إذا كان المحتوى ثنائيًا ، فسيتم تنسيقه على هذا النحو (غير مبين).


إنه يعمل ، لكنني أعتقد أن الأداة محدودة إلى حد ما.

لشيء واحد: إنه بطيء للغاية. يستغرق ~ 4 ثوانٍ لفصل ملف appnote.txt 140k من PKWare. يمكن إجراء نفس الضغط في أقل من 0.5s في برنامج .NET. تعديل: يقوم JavaScript Zipfile بإلغاء حدوث أسرع بكثير من هذا الآن ، في IE9 والكروم. لا يزال أبطأ من برنامج تجميع ، لكنه سريع للغاية لاستخدام المتصفح العادي.

لآخر: لا يفعل البث. إنه ينطق أساسا في محتويات الكبر من zipfile في الذاكرة. في بيئة برمجة "حقيقية" ، يمكنك قراءة البيانات الوصفية لملف الرمز البريدي فقط (على سبيل المثال ، 64 بايت لكل إدخال) ثم قراءة البيانات الأخرى وإزالة ضغطها حسب الرغبة. لا توجد طريقة للقيام بذلك في JavaScript ، على حد علمي ، وبالتالي فإن الخيار الوحيد هو قراءة الرمز البريدي بالكامل في الذاكرة وإمكانية الوصول العشوائي فيه. هذا يعني أنه سيضع مطالب غير معقولة على ذاكرة النظام لملفات zip الكبيرة. ليست مشكلة كبيرة لملف zip أصغر.

أيضًا: لا يتعامل مع ملف zip "الحالة العامة" - هناك الكثير من خيارات الرمز البريدي التي لم أكلف نفسي عناء تنفيذها في Unzipper - مثل تشفير الرمز البريدي ، وينزيب تشفير ، Zip64 ، UTF-8 أسماء الملفات المشفرة ، وهلم جرا. ((تعديل - يتولى أسماء الملفات المشفرة UTF-8 الآن). فئة Zipfile تتعامل مع الأساسيات ، على الرغم من. بعض هذه الأشياء لن يكون من الصعب تنفيذها. أملك فئة تشفير AES في JavaScript يمكن دمجها لدعم التشفير. من المحتمل أن يكون دعم ZIP64 عديم الفائدة بالنسبة لمعظم مستخدمي JavaScript ، حيث يهدف إلى دعم zipfiles 4 جيجابايت - لا تحتاج إلى استخراج تلك الموجودة في المتصفح.

كما أنني لم أختبر حالة إلغاء زيادة المحتوى الثنائي. الآن يلفت النص. إذا كان لديك ملف ثنائي مضغوط ، ستحتاج إلى تحرير فئة Zipfile للتعامل معه بشكل صحيح. لم أكن أعرف كيفية القيام بذلك بشكل نظيف. إنها ملفات ثنائية الآن أيضًا.


تعديل - قمت بتحديث مكتبة JS Unzip والتوضيح. إنها الآن ملفات ثنائية ، بالإضافة إلى النص. لقد جعلت الأمر أكثر مرونة وأكثر عمومية - يمكنك الآن تحديد الترميز لاستخدامه عند قراءة الملفات النصية. كما تم توسيع العرض التوضيحي - يظهر فك ضغط ملف XLSX في المتصفح ، من بين أشياء أخرى.

لذلك ، بينما أعتقد أنها ذات فائدة محدودة وفائدة ، فإنها تعمل. أعتقد أنه سيعمل في Node.js.

نصائح أخرى

أنا استخدم zip.js ويبدو أنه مفيد للغاية. إنه يستحق نظرة!

افحص ال إلغاء الضغط التجريبي, ، علي سبيل المثال.

وجدت JSzip مفيدة للغاية. لقد استخدمت حتى الآن فقط للقراءة ، لكن لديهم إمكانيات إنشاء/تحرير أيضًا.

رمز من الحكمة أنه يبدو شيئًا كهذا

var new_zip = new JSZip();
new_zip.load(file);
new_zip.files["doc.xml"].asText() // this give you the text in the file

شيء واحد لاحظته هو أنه يبدو أن الملف يجب أن يكون بتنسيق الدفق الثنائي (اقرأ باستخدام .readasarrayBuffer of FileReader () ، وإلا فإنني كنت أحصل على أخطاء تقول أنه قد يكون لدي ملف مضغوط فاسد

تم تقديم مثال رمز على موقع المؤلف. يمكنك استخدام بابلفش لترجمة النصوص (اليابانية إلى الإنجليزية).

بقدر ما أفهم اليابانية ، فإن رمز التضخم الرمز البريدي هذا يهدف إلى فك تشفير بيانات الرمز البريدي (التدفقات) وليس أرشيف الرمز البريدي.

كتبت فصلًا عن ذلك أيضًا.http://blog.another-d-mention.ro/programming/read-load-files-from-zip-in-javascript/يمكنك تحميل الأصول الأساسية مثل JavaScript/CSS/Images مباشرة من ZIP باستخدام طرق الفصل. أتمنى أن يساعد ذلك

لقد كتبت "الأدوات الثنائية لـ JavaScript" ، وهو مشروع مفتوح المصدر يتضمن القدرة على إلغاء الضغط ، UNRAR و UNTAR: https://github.com/codedread/bitjs

تستخدم في قارئ كتابي الهزلي: https://github.com/codedread/kthoom (أيضا المصدر مفتوح).

هول!

إذا كنت بحاجة إلى دعم التنسيقات الأخرى أيضًا أو تحتاج فقط إلى أداء جيد ، فيمكنك استخدام هذا مكتبة Webassembly

إنه موعوده ، ويستخدم عمال الويب لترابط وواجهة برمجة التطبيقات هي في الواقع وحدة ES بسيطة

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top