Utilisez le mode itérateur et le mode combinaison pour implémenter l'exportation en un clic et le télécharger sur des fichiers de package compressé à zip dans le navigateur
En raison des besoins du projet, je me suis souvenu du modèle de conception que j'avais vu auparavant, j'ai donc eu l'idée d'exportation en un clic.
L'idée est simple et claire. Regardez-le étape par étape.
1. Créez un objet composite
Classe de résumé public FileComponent {/ ** * Description: Créez un dossier, ou fichier * / public void mkfile () {lancez un nouveau UnportEdOperationException (); } / ** * Description: Obtenez le chemin d'entrée du fichier * / public String getInPath () {Throw New UnsupportEperException (); } / ** * Description: Obtenez le chemin de sortie du fichier * / public String getOutPath () {Throw New UnsupportEperException (); } / ** * Description: Pour les dossiers, vous pouvez ajouter d'autres dossiers ou fichiers * / public void add (fileComponent fileComponent) {lancez new UnsupportEperationException (); }}Cet objet combiné peut être un objet de dossier ou un objet de fichier spécifique. Dans l'appel ultérieur, il n'est pas nécessaire de savoir s'il s'agit d'un dossier ou d'un fichier (c'est-à-dire la transparence du mode combinaison).
2. Implémentation de la classe abstraite des objets composites
La mise en œuvre de la classe abstraite ci-dessus est la suivante:
La classe publique ZipFileItem étend FileComponent {// Chemin de la chaîne de fichiers d'entrée InPath; // Chemin de sortie de la chaîne de fichiers de sortie ENTREPACT; // Sub-Noode Fichier Information List <FileComponent> FileComponents = new ArrayList <FileComponent> (); // inPath peut être null public zipFileItem (String Outpath) {this.outpath = uppath; } // Le chemin du répertoire source du fichier compressé et de l'emplacement cible compressé public zipfileItem (String inPath, String Outpath) {this.inpath = inPath; this.outpath = extérieur; } public void add (fileComponent fileComponent) {fileComponents.add (fileComponent); } public void retire (fileComponent fileComponent) {fileComponents.Remove (fileComponent); } @Override public String getInPath () {return inPath; } @Override public String getOutPath () {return Outpath; } @Override public void mkfile () {fileUtils.createFile (inPath, Outpath); Iterator <FileComponent> iterator = fileComponents.Iterator (); // S'il s'agit d'un dossier, vous pouvez également itérer sur le fichier et l'objet de fichier spécifique dans l'objet while (iterator.hasnext ()) {fileComponent fileComponent = iterator.next (); fileComponent.mkfile (); }}}3. Classe d'outils de fichiers
Classe publique ConferenceFileUtils {/ ** * Description: Créez un fichier dans le chemin de sortie absolu basé sur le chemin absolu du fichier * @param le chemin d'entrée InPath. Si vous souhaitez le créer sur la base d'un fichier existant, vous devez passer * @param le chemin de sortie de l'entraînement. S'il s'agit d'un répertoire, vous n'utilisez pas * / public static void CreateFile (String InPath, String Outpath) {File FileIn = new File (InPath); Fichier fileout = new File (OutPath); // Si le fichier cible existe déjà, ignorez-le si le fichier n'existe pas. Créez ensuite if (! Fileout.exists ()) {int lastseparator = uptpath.lastIndexof (file.separator); String LastPart = uptpath.SubString (LastSeparator); // S'il ne s'agit pas d'un dossier, créez le fichier if (lastpart.lastIndexof (".")! = - 1) {LoggerUtil.info ("------------ Making ConcreteFile ------------------" + Outpath); FileInputStream dans = null; FileoutputStream out = null; Répertoire de fichiers = null; try {Directory = new File (outpath.SubString (0, LastSeparator + 1)); Directory.mkDirs (); out = new FileOutputStream (fileout); // si le fichier source existe if (fileIn.exists ()) {in = new FileInputStream (fileIn); int len; octet [] buf = nouveau octet [10240]; while ((len = in.read (buf))> 0) {out.write (buf, 0, len); } out.close (); joindre(); in = null; }} catch (ioException e) {System.err.println ("Création de fichiers a échoué!", E); }} // S'il s'agit d'un dossier, créez un dossier. Si le dossier de classe parent n'existe pas, créez un else { System.err.println ("--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Boolean Success = Deletedir (nouveau fichier (dir, enfants [i]); dans = null; Try {Byte [] src = new byte [1024]; (IoException e) {New IoException (e);} Enfin {if (null! = Out) {FortifyUtil.ComMonReledSource (out);} if (null! = In) {FortifyUtil.ComMonreledRedResource (in);4. code logique d'exportation de base
classe publique ExportMaterialToZipTemplate {@Resource private EnrichfilelevelSService EnrichfilelevelSService; // Nom du dossier du répertoire racine ou télécharger le nom du fichier de navigateur String privé téléchargement en téléchargement; // Root Directory Adresse private String SavePath = "d: // tempfile"; // Root Directory Path Private String SuperRootPath; // Root Directory Object Private FileComponent superroot; // Paramètre commercial DTO ExportAllTheMaterialdto Paramdto; // Réponse Réponse privée httpservletResponse; public ExportMaterialToZiptTemplate (ExportAllTheMaterialdto Paramdto, EnrichfilelevelSService EnrichFileLevelsService, HttpservletResponse Response) {this.downloadzipname = paramdto.getDownloadzipname (); this.paramdto = paramdto; this.Response = réponse; this.enrichfilelevelsService = enrichfilelevelsService; this.superrootpath = SavePath + file.separator + downloadzipName; this.superroot = new ZipFileItem (superrootpath); } // 1. Encapsulez le répertoire racine private void enrichfilelevels () {enrichfilelevelsService.enrichfilelevels (superroot, superrootpath, paramdto); } // 2. Générez le niveau du répertoire de fichiers, c'est-à-dire créer tous les fichiers (y compris les dossiers) private void CreatealLtheFiles () {if (null! = Superroot) {superroot.mkfile (); }} // 3. Après avoir généré le niveau de fichier, compressez-le et téléchargez-le dans le navigateur privé void compressandDownload () {file srcfile = new File (fortiffyUtil.filterFileName (superrootpath)); String TargetFilePath = SavePath + File.separator + srcfile.getName () + ". Zip"; Fichier TargetFile = nouveau fichier (fortifyUtil.FilterFileName (TargetFilePath)); Zipfileutil.zipfiles (srcfile, ciblefile); try {// compress file temporary path string downfileName = downloadzipname + ". zip"; réponse.RESET (); // Définissez le type de sortie Response.SetContentType ("Application / Octet-Stream"); Response.sethEader ("Content-Disposition", "Pixe; FileName =" + Nouvelle String (DownFileName.GetBytes ("GBK"), "ISO-8859-1") + "; size =" + TargetFile.Length ()); OutputFileUtil.OutputFile (TargetFile, réponse); // Supprimer le dossier stocké temporairement if (srcfile.exists ()) {ConferenceFileUtils.deletedir (srcfile); } // Supprimer le package compressé temporaire if (cibleFile.exists ()) {TargetFile.Delete (); }} catch (ioException e) {Devlog.Error (e.getMessage ()); }} // Exportation en un clic, mode d'apparence publique void export () {enrichfilelevels (); CreateArallTheFiles (); compressandDownload (); }}5. Enrichir les interfaces au niveau des fichiers
Interface publique EnrichfilelevelsService {public void Enrichfilelevels (FileComponent superroot, String superrootpath, exportalltheterialdto paramdto);} Dans différents scénarios d'entreprise, implémentez simplement cette interface, implémentez la méthode EnrichFileLevels (), passez l'instance de classe qui implémente cette interface à la méthode du constructeur de la classe ExportMaterialToZipTemplate, puis appelez la méthode Export () de l'instance de classe ExportMaterialToZipTemplate. Tout de suite
Nouveau exportmaterialtoziptemplate (dtoparams,
enrichfilelevelSService, réponse) .Export ();
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.