SORU
19 Ocak 2010, Salı


Şunu dosyaları

OpenOffice dosyaları görüntülemek istiyorum .odt ve .istemci tarafında odp bir web tarayıcısı kullanarak.

Bu dosyalar sıkıştırılmış dosyalardır. Ajax kullanarak, sunucudan bu dosyaları alabilirim ama bunlar sıkıştırılmış dosyalardır. Bunları halletmek için JavaScript, inflate.js, http://www.onicos.com/staff/iz/amuse/javascript/expert/inflate.txt, ancak başarılı olamadı kullanarak denedim kullanıyorum.

Bunu nasıl yapabilirim?

CEVAP
19 Ocak 2010, Salı


Javascript bir unzipper yazdım. Çalışıyor.

Andy G.P. Na's binary file reader some RFC1951 inflate logic from notmasteryet dayanır. ZipFile sınıfı ekledim.

örnek çalışma:
http://cheeso.members.winisp.net/Unzip-Example.htm (ölü link)

Kaynak:
http://cheeso.members.winisp.net/srcview.aspx?dir=js-unzip (ölü link)

NB: bağlantılar öldü; yeni bir ev sahibi yakında bulacağım.

Kaynağında bulunan gösteri sayfası, ve 3 farklı komut, zipfile sınıfı için bir sınıf, ve bir ikili dosya için bir şişirmek okuyucu sınıfı için bir zipfile.htm . Demo ayrıca jQuery ve jQuery UI bağlıdır. Eğer sadece js-zip.zip dosyayı indirip, gerekli kaynağı var.


Uygulama kodu Javascript: böyle görünüyor işte

// 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));
    }
}

Birkaç adım demo çalışır: readFile fn bir tıklama ile tetiklenir, ve zip dosyasını okur ZipFile bir nesne oluşturur. Bir zaman uyumsuz geri arama için zaman okumak tamamlar (genellikle olur, kısa bir süre önce bir an için kabul edilebilir ölçülerde fermuarlar) - bu demo geri düzenlenen doneReading yerel değişken, hangi sadece arama extractEntries, körü körüne verilen zip dosyasının tüm içeriğini unzips. Gerçek bir uygulama muhtemelen ayıklamak için girişleri (kullanıcı seçmek için izin, ya da bir veya daha fazla girdi seçin program aracılığıyla, vs.) bazı seçmelisiniz.

extractEntries fn tüm girdileri üzerinde dolaşır ve her biri üzerinde extract() bir geri arama çağırır. Bir giriş açma zamanı, belki 1 veya daha fazla asynchrony uygun olduğu anlamına gelir zipfile, her giriş için alır. Özü geri basitçe sayfasında jQuery akordiyon için çıkarılan içerik ekler. Eğer içeriği ikili ise, bu (yağ) olarak biçimlendirilmiş alır.


Çalışıyor ama programı biraz sınırlı olduğunu düşünüyorum.

Birincisi: çok yavaş. ~4 PKWare 140k appnote.txt dosya açmak için saniye sürer. Aynı sıkıştırmasını daha az yapılabilir .5s .NET programı.EDİT: Javascript ZipFile önemli ölçüde daha hızlı şimdi, Krom 9 ve ayıklar. Hala derlenmiş bir program daha yavaş, ama çok hızlı normal tarayıcı kullanımı içindir.

Bir diğeri için: akıtma yapmaz. Temelde belleğe zipfile tüm içeriği slurps. Bir "gerçek" bir zip dosyası sadece meta (64 giriş başına bayt say) okuma ve istenen diğer veri okuma sıkıştırması daha sonra bir programlama ortamı. Javascript, bildiğim kadarıyla, bu nedenle tek seçenek belleğe tüm zip okuyan ve rastgele erişim yapmak gibi bir IO yapmanın bir yolu yok. Bu büyük zıp dosyaları için sistem belleği mantıksız taleplerde anlamına gelir. Çok küçük bir zip dosyası için bir sorun değil.

Ayrıca: yok kolu "genel durum" zip dosyası bir sürü vardır zıp seçenek olduğunu bilmiyordum rahatsız uygular unzipper - POSTA şifreleme, Yedekleme şifreleme, zip64,UTF-8 kodlanmış dosya adları,ve benzeri. (EDİT- UTF-8 olarak kodlanmış dosya artık) yönetir. ZipFile sınıfı temel gerçi işler. Bunlardan bazılarını uygulamak zor olmayacaktır. Javascript an AES encryption class var; şifreleme desteği için entegre olabilir. Zip64 destek muhtemelen ^ destek amaçlı olduğu için çoğu Javascript kullanıcıları işe yaramaz . 4gb zipfiles - bir tarayıcı gibi sorulara gerek yok.

Ben de ikili içerik ayıklama için durum test etmedi. Şu anda metin unzips. Eğer sıkıştırılmış ikili bir dosya varsa, bunu düzgün bir şekilde işlemek için ZipFile sınıfı düzenlemek için ihtiyacınız olacak. Bunu temiz bir şekilde nasıl yazarım bilemedim.İkili dosyaları şimdi de öyle.


EDİT- JS ayıklayın kütüphane ve demo güncelledi. Şimdi ikili dosyaları, metin ek olarak geliyor. Daha esnek ve daha genel yaptım - şimdi kodlama metin dosyaları okurken belirtebilirsiniz. Ayrıca demo genişletilir - diğer şeyler arasında tarayıcıda XLSX dosyası, şunu gösterir.

Sınırlı yarar ve ilgi çekici olduğunu düşünüyorum uzun süre çalışır. Node.js içinde işe yarar sanırım.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • EmbarkToHeaven

    EmbarkToHeav

    3 EYLÜL 2007
  • Evan Coury

    Evan Coury

    29 NİSAN 2007
  • OnlyFunClips

    OnlyFunClips

    16 ŞUBAT 2012