Zipper/Dezipper en LotusScript et Java

Toutes les astuces sur le langage Java dans Lotus Notes

Zipper/Dezipper en LotusScript et Java

Messagepar Stephane Maillard » 27 Juin 2006 à 09:05

Voici un exemple de code en LotusScript.

[syntax="LotusScript"]Uselsx "*javacon" 'Which lets you use Java from LotusScript
Use "ZipFile" 'A Java library that holds a function to do zipping

Sub Initialize
Dim js As JAVASESSION
Dim zipClass As JAVACLASS
Dim zipFileObject As JavaObject
Dim varFileToZip As String, varOutFilePath As String, returnCode As String

Set js = New JAVASESSION
Set zipClass = js.GetClass("ZipFile")
Set zipFileObject = zipClass.CreateObject
varFileToZip = "c:tempdocument.doc"
varOutFilePath = "c:tempthezipfile.zip"

returnCode = zipFileObject.zipMyFile(varFileToZip, varOutFilePath) 'Calling the zip function

If Not returnCode = "OK" Then
Print "An Error occurred"
Else
Print "Zip went OK"
End If
End Sub
[/syntax]
Le code Java.

[syntax="java"]import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.Deflater;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class ZipFile {
public String zipMyFile(String fileToZip, String zipFilePath) {
String result = "";

byte[] buffer = new byte[18024];

// Specify zip file name
String zipFileName = zipFilePath;

try {

ZipOutputStream out =
new ZipOutputStream(new FileOutputStream(zipFileName));

// Set the compression ratio
out.setLevel(Deflater.BEST_COMPRESSION);

System.out.println(fileToZip);
// Associate a file input stream for the current file
FileInputStream in = new FileInputStream(fileToZip);

// Add ZIP entry to output stream.
out.putNextEntry(new ZipEntry(fileToZip));

// Transfer bytes from the current file to the ZIP file
//out.write(buffer, 0, in.read(buffer));

int len;
while ((len = in.read(buffer)) > 0)
{
out.write(buffer, 0, len);
}

// Close the current entry
out.closeEntry();

// Close the current file input stream
in.close();

// Close the ZipOutPutStream
out.close();
}
catch (IllegalArgumentException iae) {
iae.printStackTrace();
return "ERROR_ILLEGALARGUMENTSEXCEPTION";
}
catch (FileNotFoundException fnfe) {
fnfe.printStackTrace();
return "ERROR_FILENOTFOUND";
}
catch (IOException ioe)
{
ioe.printStackTrace();
return "ERROR_IOEXCEPTION";
}


return "OK";

}
}[/syntax]
Dernière édition par Stephane Maillard le 04 Mai 2008 à 17:42, édité 1 fois.
Cordialement

Stéphane Maillard
Avatar de l’utilisateur
Stephane Maillard
Lord of DominoArea
Lord of DominoArea
 
Message(s) : 8695
Inscrit(e) le : 16 Déc 2004 à 01:10
Localisation : Bretagne

Messagepar philippe » 27 Juin 2006 à 20:59

Bon je vais parraitre débutant, mais je suis trop ... vieux pour avoir eut l'occasion d'étudier le Java dans ma jeunesse :lol:

L'idée de pouvoir utiliser le Java dans du Lotusscript me plait donc énormément même si je doute des performances. Je me suis donc jeté sur l'exemple donné mais j'ai un affreux message d'erreur lors de la tentative de chargement de la librairie 'ZipFile'. :?
Faut il télécharger cette librairie ? Si c'est le cas, laquelle et où l'installer.

Désolé si la question peut parraitre triviale auprès des experts Java :oops:
philippe
Modérateur
Modérateur
 
Message(s) : 235
Inscrit(e) le : 11 Juin 2006 à 21:20
Localisation : Epernon

Messagepar Stephane Maillard » 27 Juin 2006 à 21:03

Salut,

En fait du met le code dans une bibliothèque de script java et dans l'exemple elle s'appel ZipFile, j'ai oublié de le précisé. :oops:

EDIT => je parle bien sur du code Java ! :?
Cordialement

Stéphane Maillard
Avatar de l’utilisateur
Stephane Maillard
Lord of DominoArea
Lord of DominoArea
 
Message(s) : 8695
Inscrit(e) le : 16 Déc 2004 à 01:10
Localisation : Bretagne

Messagepar philippe » 27 Juin 2006 à 22:10

Ne rougis pas ! Au contraire !
Non seulement celà fonctionne à merveille chez moi, non seulement c'est très rapide contrairement à ce que je craignais, mais en plus celà m'ouvre de nouvelles perspectives énormes dans le domaine du traitement d'image ainsi que des communications Internet où le Java offre beaucoup plus de possibilités que le LotusScript.

Bref, Merci
:D
philippe
Modérateur
Modérateur
 
Message(s) : 235
Inscrit(e) le : 11 Juin 2006 à 21:20
Localisation : Epernon

Messagepar m@noo » 13 Nov 2007 à 10:01

Salut

bon point de départ mais çà ne zip qu'un seul fichier.
J'ai donc ajouté un méthode récursive pour zipper les sous-répertoires.

J'ai rencontré un problème d'encodage des noms de fichiers à zipper (classique me direz-vous vu le nombre de sujet qui en parle sur le forum Sun :lol: )
J'ai résolu le problème en utilisant le package de Ant org.apache.tools.zip (qui propose l'encoding) en lieu et place du package java.util.zip
J'ai mis carrément les sources des classes de ce package dans ma bibliothèque Domino. J'ai utilisé le code Cp850 pour l'encoding.

Serveur Domino 6.5 sous windows et appel de l'agent en mode web.

Voilà, si besoin vous pouvez me contacter par mail plutôt.
Je ne passe pas fréquemment puisque çà fait un bail que je n'avais pas touché à Domino (j'en étais resté à la V5 il y a 6 ans; comme quoi votre expérience vous rattrape toujours :lol: )
Auquel cas si çà intéresse je développerai un peu.

@+
m@nu
Avatar de l’utilisateur
m@noo
Découvre Dominoarea
Découvre Dominoarea
 
Message(s) : 6
Inscrit(e) le : 12 Nov 2007 à 14:40
Localisation : Treize-Septiers (Vendée)

Messagepar m@noo » 17 Mars 2009 à 14:11

Mickael tu as bien fait de faire un mail, je ne fais plus de domino depuis cette mission il y a un an 1/2 :lol:

J'ai toutefois retrouvé le code (sur un forum interne) le voici
Code : Tout sélectionner
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.zip.Deflater;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipOutputStream;

public class ZipFileExportCD {
   
   // méthode qui va être appelée récursivement si on liste un répertoire
   // elle crée
   //       l'entrée dans le zip
   //       les fichiers dans le zip
   // pathToZip : chemin d'accès au répetoire à compresser
   // pathInZip : chemin que l'on souhaite au niveau de l'entrée dans le Zip
   // zip : le fichier zip en sortie
   private void compresser(String pathToZip,String pathInZip, ZipOutputStream zip) throws Exception{
      byte[] buffer = new byte[10240];
      File rep = new File(pathToZip);
      File[] fichiers = rep.listFiles();
       
      for (int i=0;i<fichiers.length;i++) {
         if (fichiers[i].isDirectory()) {
                  System.out.println("Répertoire à zipper => "+ fichiers[i].getName());
                  compresser(fichiers[i].getPath(),pathInZip+fichiers[i].getName()+"\\",zip);
         }
         else
         {
            writeToZip(fichiers[i].getPath(),pathInZip+fichiers[i].getName(),zip);
         }
      }
   }
   
   private void writeToZip(String fileOnDisk, String fileInZip,ZipOutputStream zip) throws Exception {
      byte[] buffer = new byte[10240];
      File rep = new File(fileOnDisk);
       
      zip.putNextEntry(new ZipEntry(fileInZip));
      // lecture du fichier et transfert dans le zip
      FileInputStream fichier = new FileInputStream(fileOnDisk);
      int len;
      while ((len = fichier.read(buffer)) > 0) {
         zip.write(buffer, 0, len);
      }
      // fermeture du fichier
      fichier.close();
      // fermeture de l'entrée dans le zip
      zip.closeEntry();
   }
   
   public boolean creerZip(String pathToZip,String pathInZip, String zipFilePath, String zipFileName,String encoding) {
      ZipOutputStream zip = null;
             
      try {
         zip = new ZipOutputStream(new FileOutputStream(zipFilePath +"\\"+ zipFileName));
         // on met l'encodage pour ne pas perdre les accents des noms de fichiers
         // lors de la création des entrées dans le zip
         zip.setEncoding(encoding);
         // Set the compression ratio
         zip.setLevel(Deflater.BEST_COMPRESSION);
         //
         
         if (!pathInZip.equals("")) {
            pathInZip = pathInZip+"\\";
         }
         compresser(pathToZip,pathInZip, zip);         
         // fermeture du fichier Zip
         //zip.close();
         System.out.println("Fin de la création du Zip");         
      }
      catch (Exception e) {
         e.printStackTrace();
         return false;
      } finally {
         try {
            if (zip!=null) zip.close();
         }
         catch (Exception e) {
         }
      }
      return true;
   }
}


Petit rappel, j'avais donc utiliser le package org.apache.tools.zip à la place de java.util.zip pour avoir l'encoding.
J'avais mis les sources de ce package directement dans une bibiliothèque java de Domino.

@+
m@nu
Avatar de l’utilisateur
m@noo
Découvre Dominoarea
Découvre Dominoarea
 
Message(s) : 6
Inscrit(e) le : 12 Nov 2007 à 14:40
Localisation : Treize-Septiers (Vendée)


Retour vers Java