Question

Je veux afficher fichiers OpenOffice , .odt et .odp à côté client à l'aide un navigateur Web.

Ces fichiers sont des fichiers compressés. En utilisant Ajax, je peux obtenir ces fichiers à partir du serveur, mais ce sont des fichiers compressés. Je dois décompressez en utilisant JavaScript, j'ai essayé d'utiliser inflate.js, http://www.onicos.com/staff/iz/amuse/javascript/expert/ inflate.txt , mais sans succès.

Comment puis-je faire?

Était-ce utile?

La solution

J'ai écrit un dézippeur en Javascript. Ça marche.

Il repose sur Andy G.P. lecteur de fichier binaire de Na et une certaine logique RFC1951 gonflent de notmasteryet . J'ai ajouté la classe ZipFile.

Exemple de travail:
http://cheeso.members.winisp.net/Unzip-Example.htm (lien mort)

La source:
http://cheeso.members.winisp.net/srcview.aspx?dir = js-décompression (lien mort)

NB : les liens sont morts; Je vais trouver un nouvel hôte bientôt.

Inclus dans la source est une page de démonstration ZipFile.htm et 3 scripts distincts, l'un pour la classe zipfile, un pour la classe gonflent, et un pour une classe de lecteur de fichier binaire. La démo dépend aussi de jQuery et jQuery UI. Si vous venez de télécharger le fichier js-zip.zip, toutes les sources nécessaires est là.


Voici ce que le code de l'application ressemble en 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));
    }
}

La démo fonctionne en deux étapes: La readFile fn est déclenchée par un clic, et instancie un objet ZipFile, qui lit le fichier zip. Il y a un rappel asynchrone lorsque la lecture complète (se produit généralement en moins d'une seconde pour zips de taille raisonnable) - dans cette démo le rappel est maintenu dans la variable locale doneReading, qui appelle simplement extractEntries, qui juste décompresse aveuglément tout le contenu du fichier zip fourni. Dans une application réelle, vous choisiriez probablement quelques-unes des entrées pour extraire (permettre à l'utilisateur de sélectionner ou choisir une ou plusieurs entrées par programmation, etc.).

Les itère extractEntries fn sur toutes les entrées et les appels extract() sur chacun d'eux, le passage d'un rappel. Décompression d'une entrée prend du temps, peut-être 1 ou de plus pour chaque entrée dans le fichier zip, ce qui signifie asynchronisme est approprié. Le rappel extrait ajoute simplement le contenu d'un accordéon extrait dans jQuery sur la page. Si le contenu est binaire, il sera formaté en tant que tel (non représenté).


Il fonctionne, mais je pense que l'utilité est quelque peu limitée.

Pour une chose: Il est très lent. Prend ~ 4 secondes pour décompresser le fichier 140k de APPNOTE.TXT de PKWare. Le même Décompresser peut être fait en moins de .5s dans un programme .NET EDIT :. Le Javascript ZipFile décompresse considérablement plus vite que maintenant, dans IE9 et Chrome. Il est encore plus lent qu'un programme compilé, mais il est beaucoup rapide pour une utilisation normale du navigateur.

Pour un autre: il ne fait pas le streaming. Il slurps essentiellement dans le contenu du fichier zip dans la mémoire. Dans un environnement de programmation « réel » que vous pouvez lire que dans les métadonnées d'un fichier zip (par exemple, 64 octets par entrée), puis lire et décompresser les autres données comme vous le souhaitez. Il n'y a pas moyen de faire IO comme ça en javascript, pour autant que je sache, donc la seule option est de lire le zip entier en mémoire et faire un accès aléatoire en elle. Cela signifie qu'il imposera des exigences déraisonnables sur la mémoire du système pour les gros fichiers zip. Pas tellement un problème pour un fichier zip plus petit.

Aussi: Il ne gère pas le fichier zip « cas général » - il y a beaucoup d'options zip que je ne l'ai pas pris la peine de mettre en œuvre dans le dézippeur - comme le cryptage ZIP, cryptage WinZip, Zip64, UTF- 8 noms de fichiers codés, et ainsi de suite. ( EDIT - il gère les noms de fichiers codés UTF-8 maintenant). La classe ZipFile gère les bases, cependant. Certaines de ces choses ne serait pas difficile à mettre en œuvre. Je une classe de cryptage AES en Javascript; qui pourraient être intégrés pour soutenir le chiffrement. soutien Zip64 serait probablement inutile pour la plupart des utilisateurs de Javascript, car il est destiné à soutenir> 4gb zipfiles - ne pas besoin d'extraire ceux dans un navigateur.

Je n'ai pas testé aussi le cas pour dézipper le contenu binaire. En ce moment, il décompresse texte. Si vous avez un fichier binaire compressé, vous aurez besoin de modifier la classe ZipFile pour gérer correctement. Je ne figure pas comment le faire proprement. Il fait des fichiers binaires maintenant, aussi.


EDIT - Je mis à jour la bibliothèque JS Décompressez et démonstration. Il fait maintenant des fichiers binaires, en plus du texte. Je l'ai fait plus résistant et plus général - vous pouvez maintenant spécifier l'encodage à utiliser lors de la lecture des fichiers texte. Aussi la démo est agrandi - il montre décompressé un fichier XLSX dans le navigateur, entre autres.

Ainsi, alors que je pense qu'il est d'une utilité limitée et de l'intérêt, cela fonctionne. Je suppose que cela fonctionnerait dans Node.js.

Autres conseils

J'utilise zip.js et il semble être très utile. Il vaut le détour!

Vérifiez la Décompressez démo , par exemple.

jszip très utile. Je l'ai utilisé jusqu'à présent que pour la lecture, mais ils ont créer / modifier des capacités ainsi.

Code de sage, il ressemble à ceci

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

Une chose que je remarque est qu'il semble que le fichier doit être au format flux binaire (lecture en utilisant la .readAsArrayBuffer de FileReader (), sinon je recevais des erreurs disant que je pourrais avoir un fichier zip corrompu

Exemple de code est donné de sur le site de l'auteur . Vous pouvez utiliser Babelfish pour traduire les textes (japonais à l'anglais).

Pour autant que je comprends japonais, ce code postal gonfler est destiné à décoder les données ZIP (flux) ne archive ZIP.

J'ai écrit une classe pour cela aussi. http: //blog.another- d-mention.ro/programming/read-load-files-from-zip-in-javascript/ Vous pouvez charger des actifs de base tels que le javascript / css / images directement à partir du zip en utilisant des méthodes de classe. Hope it helps

J'ai écrit "Outils binaires pour JavaScript", un projet open source qui inclut la possibilité de dézipper, unrar et décompressez: https://github.com/codedread/bitjs

Utilisé dans mon lecteur de bande dessinée: https://github.com/codedread/kthoom ( également open source).

HTH!

Si vous devez prendre en charge d'autres formats aussi bien ou tout simplement besoin d'une bonne performance, vous pouvez utiliser cette WebAssembly bibliothèque

il est basé promis, il utilise WebWorkers pour le filetage et l'API est en fait simple module de ES

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top