Verwenden
Aufgrund der Bedürfnisse des Projekts erinnerte ich mich an das Entwurfsmuster, das ich zuvor gesehen hatte, und hatte die Idee, einen Ein-Klick-Export zu machen.
Die Idee ist einfach und klar. Beobachten Sie es einfach Schritt für Schritt.
1. Erstellen Sie ein zusammengesetztes Objekt
public abstract Class FileComponent { / ** * Beschreibung: Erstellen Sie rekursiv einen Ordner oder eine Datei * / public void mkFile () {werfen neu nicht unterstützte OperationException (); } / ** * Beschreibung: Holen Sie sich den Dateieingangspfad * / public String getInPath () {werfen Sie neue nicht unterstützte OperationException (); } / ** * Beschreibung: Holen Sie sich den Dateiausgabepfad * / public String getoutPath () {werfen Sie neue nicht unterstützte OperationException (); } / *** Beschreibung: Für Ordner können Sie andere Ordner oder Dateien hinzufügen. }}Dieses Kombinationsobjekt kann ein Ordnerobjekt oder ein bestimmtes Dateiobjekt sein. Im nachfolgenden Anruf müssen nicht wissen, ob es sich um einen Ordner oder eine Datei handelt (dh der Transparenz des Kombinationsmodus).
2. Implementierung der Zusammenfassung der zusammengesetzten Objekte abstrakte Klasse
Die Implementierung der obigen abstrakten Klasse lautet wie folgt:
öffentliche Klasse ZipFileItem erweitert filecomponent {// Pfad der Eingabedatei String inpath; // Pfad der Ausgabedatei String outPath; // Informationsliste für Subnode -Datei <DileComponent> filecomponents = new ArrayList <DileComponent> (); // Inpath kann null public zipfileItem (String outPath) {this.outPath = outPath; } // Der Quellverzeichnispfad der komprimierten Datei und der komprimierte Zielort public zipfileItem (String Inpath, String OutPath) {this.inPath = Inpath; this.outPath = outPath; } public void add (filecomponent filecomponent) {filecomponents.add (filecomponent); } public void entfernen (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 (); // Wenn es sich um einen Ordner handelt, können Sie auch über die Datei und das spezifische Dateiobjekt im Objekt wob filecomponent.mkFile (); }}}3. Datei -Toolklasse
Public Class ConferenceFileTils { /** * Beschreibung: Erstellen Sie eine Datei im absoluten Ausgabepfad basierend auf dem absoluten Pfad der Datei * @param Inpath -Eingabepfad. Wenn Sie es basierend auf einer vorhandenen Datei erstellen möchten, müssen Sie * @Param OutPath -Ausgangspfad übergeben. Wenn es sich um ein Verzeichnis handelt, verwenden Sie */ public static void createFile (String Inpath, String outPath) {Datei -Dateiin = neue Datei (inPath); Dateidateiout = neue Datei (OutPath); // Wenn die Zieldatei bereits vorhanden ist, ignorieren Sie sie, wenn die Datei nicht vorhanden ist. Dann create if (! Fileout.exists ()) {int lastSparator = outpath.lastindexof (Datei.Separator); String lastPart = outPath.substring (lastSesparator); // Wenn es sich nicht um einen Ordner handelt, erstellen Sie die Datei if (lastPart.lastIndexof (".")! FileInputStream in = null; FileOutputStream out = null; Dateiverzeichnis = null; try {Directory = neue Datei (outPath.substring (0, lastSesparator+1)); Verzeichnis.mkdirs (); out = new FileOutputStream (FileOut); // Wenn die Quelldatei vorliegt, wenn (fileIn.exists ()) {in = new FileInputStream (Dateiin); Int len; byte [] buf = neues byte [10240]; while ((len = in.read (buf))> 0) {out.write (buf, 0, len); } out.close (); in.close (); in = null; }} catch (ioException e) {System.err.println ("Datei erstellen fehlgeschlagen!", E); }} // Wenn es sich um einen Ordner handelt, erstellen Sie einen Ordner. Wenn der Ordner der übergeordneten Klassen nicht existiert, erstellen Sie eine andere {{ System.err.println ("------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Boolean Erfolg = Deletedir (neue Datei, Kinder [i]); In = NULL; (IOException E) {Neue IOException (e);4. Core Export Logic Code
öffentliche Klasse Exportmaterialtoziptemplate {@Resource Private EnrichFilelevelsservice EnrichFileLevelsservice; // Root Directory Ordner Name oder Download Browser -Dateiname private Zeichenfolge DownloadzipName; // Root -Verzeichnisadresse private String SavePath = "d: // tempfile"; // Root Directory Path Private String SuperrootPath; // Root Directory Object Private Filecomponent Superroot; // Geschäftsparameter DTO Private ExportalltHematerialdto Paramdto; // Antwort private httpServletResponse -Antwort; public exportmaterialtoziptemplate (ExportAlltHematerialdto paramdto, EnrichFileLevelsservice EnrichFilelevelsservice, httpServletResponse -Antwort) {thdownloadzipname = paramdto.getdownloadzipname (); this.paramdto = paramdto; this.Response = Antwort; this.enrichfilelevelsservice = anArrichFilelevelsservice; this.superRootPath = savePath+file.separator+downloadzipname; this.superroot = neu zipfileItem (SuperrootPath); } // 1. Kapitulieren Sie das Root Directory Private void EnrichFilelevels () {EnrichFilelevelsService.EnrichFilelevels (Superroot, SuperrootPath, Paramdto); } // 2. Generieren Sie die Dateiverzeichnisebene, dh alle Dateien (einschließlich Ordner) privat void createAltheFiles () {if (null! = Superroot) {Superroot.mkFile (); }} // 3. Nach dem Generieren der Dateiebene komprimieren Sie sie dann und laden Sie sie in den Browser Private void compressAndownload () {Datei srcFile = new Datei (fortifyutil.filterFileName (SuperrootPath)) herunter; String targetFilePath = SavePath+Datei.Sesparator+srcFile.getName ()+". ZIP"; Datei targetFile = neue Datei (fortifyutil.filterFileName (targetFilepath)); ZipfileUtil.zipfiles (srcFile, targetFile); Versuchen Sie {// Datei Temporary Pfad String DownFileName = DownloadzipName+". ZIP"; response.reset (); // Definieren Sie die Antworttyp-Antwort. response.setheader ("Inhaltsdisposition", "Anhang; Dateiname =" + neue String (DownFileName.getBytes ("GBK"), "ISO-8859-1") + "; size =" + targetFile.Length ()); OutputFileUtil.outputFile (TargetFile, Antwort); // den Ordner vorübergehend gespeichert if (srcFile.exists ()) {ConferenceFileUtils.deletedir (SrcFile); } // das temporäre komprimierte Paket löschen if (targetFile.exists ()) {targetFile.delete (); }} catch (ioException e) {devlog.Error (e.getMessage ()); }} // Ein-Klick-Export, Aussehensmodus public void export () {EnrichFilelevels (); CreateAltheFiles (); compressArdownload (); }}5. Schnittstellen auf Dateiebene angeben
öffentliche Schnittstelle EnrichFilelevelsService {public void EnrichFilelevels (FileComponent Superroot, String SuperrootPath, ExportalltHemateriDto Paramdto);};};}; Implementieren Sie in verschiedenen Geschäftsszenarien einfach diese Schnittstelle, implementieren Sie die Methode EnrichFilelevels (), übergeben Sie die Klasseninstanz, die diese Schnittstelle zur Konstruktormethode der Exportmaterialtoziptemplate -Klasse implementiert, und rufen Sie dann die Exporte () -Methode der exportmaterialtoziptemplate -Klasse -Instanzinstanz auf. Im Augenblick
Neue Exportmaterialtoziptemplate (Dtoparams,
EnrichFilelevelsservice, Antwort) .export ();
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.