Use el modo iterador y el modo de combinación para implementar la exportación y descargar un clic y descargar a los archivos de paquete comprimidos en el navegador
Debido a las necesidades del proyecto, recordé el patrón de diseño que había visto antes, así que tenía la idea de una exportación con un solo clic.
La idea es simple y clara. Solo míralo paso a paso.
1. Crea un objeto compuesto
Public Abstract Class FileComponent { / ** * Descripción: crea recursivamente una carpeta o archivo * / public void mkfile () {tire nuevo sin soporte } / ** * Descripción: Obtenga la ruta de entrada de archivo * / public String getInpath () {lanzar nueva UnsupportedOperationException (); } / ** * Descripción: Obtenga la ruta de salida del archivo * / public String getOutPath () {lanzar nueva UnsupportedOperationException (); } / *** Descripción: Para las carpetas, puede agregar otras carpetas o archivos* / public void add (fileComponent fileComponent) {lanzar nueva no comprobaciónperationException (); }}Este objeto de combinación puede ser un objeto de carpeta o un objeto de archivo específico. En la llamada posterior, no hay necesidad de saber si es una carpeta o un archivo (es decir, la transparencia del modo de combinación).
2. Implementación de la clase de resumen de objetos compuestos
La implementación de la clase abstracta anterior es la siguiente:
public class ZipFileItem extiende FileComponent {// ruta de la cadena de archivo de entrada inPath; // ruta de la excursión del archivo de salida String; // Lista de información del archivo de subnode <Silecomponent> fileComponents = new ArrayList <FileComponent> (); // Inpath puede ser NULL public ZipFileItem (String Outpath) {this.outPath = Outpath; } // La ruta del directorio de origen del archivo comprimido y la ubicación de destino comprimida public ZipFileItem (String inPath, String Outpath) {this.Inpath = inPath; this.outPath = Outpath; } public void add (fileComponent fileComponent) {fileComponents.Add (fileComponent); } public void eliminar (fileComponent fileComponent) {fileComponents.remove (fileComponent); } @Override public String getInpath () {return inPath; } @Override public String getOutPath () {return sutpath; } @Override public void mkfile () {fileUtils.createFile (inPath, OutPath); Iterator <FileComponent> iterator = FileComponents.Iterator (); // Si es una carpeta, también puede iterar sobre el archivo y el objeto de archivo específico en el objeto mientras (iterator.hasNext ()) {fileComponent fileComponent = iterator.next (); fileComponent.mkFile (); }}}3. Clase de herramienta de archivo
Conferencia de clase públicaFileUtils { /** * Descripción: Cree un archivo en la ruta de salida absoluta basada en la ruta absoluta del archivo * @param Inpath Input Rath. Si desea crearlo en función de un archivo existente, debe pasar * @param Outpath Path de salida. Si es un directorio, no usa */ public static void createFile (String inPath, String OutPath) {file filein = new File (inPath); Archivo fileOut = nuevo archivo (EutPath); // Si el archivo de destino ya existe, ignórelo si el archivo no existe. Luego cree if (! FileOut.Exists ()) {int LastSarator = OutPath.lastIndexOf (file.separator); Cadena lastPart = OutPath.Substring (LastSePoRator); // Si no es una carpeta, cree el archivo if (lastPart.lastIndexof (".")! =-1) {loggerutil.info ("------------- Hacer concretefile -------------"+Outpath); FileInputStream in = null; FileOutputStream out = null; Directorio de archivos = nulo; intente {directorio = new File (OutPath.Substring (0, LastSparator+1)); directorio.mkdirs (); out = new FileOutputStream (FileOut); // Si el archivo de origen existe si (fileIn.exists ()) {in = new FileInputStream (FileIn); int len; byte [] buf = nuevo byte [10240]; while ((len = in.read (buf))> 0) {out.write (buf, 0, len); } out.close (); cercar(); in = nulo; }} catch (ioException e) {system.err.println ("¡Crear archivo fallido!", e); }} // Si es una carpeta, cree una carpeta. Si la carpeta de clase principal no existe, cree una else { System.err.println ("------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------- Boolean Success = Deletedir (nuevo archivo (dir, niños [i])); In = NULL; (IOException e) {tirar nueva IOException (e);4. Código lógico de exportación de núcleo
clase pública exportMaterialToZiptEmplate {@Resource private enrichfilelevelsservice enrichfilelevelsService; // Nombre de la carpeta de directorio root o descargar el nombre del archivo del navegador Private String downloadzIpName; // Dirección de directorio raíz Cadena privada SavePath = "d: // tempfile"; // ruta de directorio root String private SuperrootPath; // objeto de directorio raíz súper root private filecomponente; // Parámetro comercial DTO Private ExportAllThematerialDto Paramdto; // Respuesta privada httpservletResponse; Public ExportMaterialToZiptEmplate (ExportAllThematerIldto Paramdto, enrichfilelevelsService enrichfilelevelSservice, httpServletResponse Respuesta) {this.downloadzipName = paramdto.getdownloadzipName (); this.paramdto = paramdto; this.Response = Respuesta; this.enrichfilelevelsService = enrichfilelevelsService; this.superrootPath = savePath+file.separator+downloadzIpName; this.superroot = new ZipFileItem (SuperrootPath); } // 1. Encapsular el directorio raíz privado void enrichfilelevels () {enrichfilelevelsservice.enrichfilelevels (Superroot, SuperrootPath, ParamDTO); } // 2. Genere el nivel de directorio de archivos, es decir, cree todos los archivos (incluidas las carpetas) private void createAnlTheFiles () {if (null! = Superroot) {superroot.mkfile (); }} // 3. Después de generar el nivel de archivo, luego comprimirlo y descargarlo en el navegador privado void compressandDownload () {archivo srcfile = nuevo archivo (fortifyutil.filterfilename (superrootpath)); String TargetFilePath = SavePath+File.separator+srcfile.getName ()+". Zip"; Archivo TargetFile = nuevo archivo (fortifyutil.filterFileName (TargetFilePath)); ZipfileUtil.zipfiles (srcfile, targetFile); Pruebe {// Comprima el archivo Temporal String String DownFileName = downloadzIpName+". Zip"; respuesta.reset (); // Definir la respuesta del tipo de salida.setContentType ("Application/Octet-stream"); Respuesta.Setheader ("Content-Disposition", "Attachment; FileName =" + New String (downfileName.getBytes ("GBK"), "ISO-8859-1") + "; size =" + TargetFile.lengment ()); OutputFileUtil.outputFile (TargetFile, respuesta); // Eliminar la carpeta almacenada temporalmente if (srcfile.exists ()) {conferenceFileUtils.deletedir (srcfile); } // Elimine el paquete comprimido temporal if (targetFile.Exists ()) {TargetFile.Delete (); }} catch (ioException e) {devlog.error (e.getMessage ()); }} // Exportación de un solo clic, Modo de apariencia public void export () {enrichfilelevels (); createAllTheFiles (); compressandDownload (); }}5. Enriquecer las interfaces a nivel de archivo
interfaz pública enrichfilelevelsService {public void enrichfilelevels (FileComponent Superroot, String SuperrootPath, ExportAllThematerIldto Paramdto);} En diferentes escenarios comerciales, simplemente implemente esta interfaz, implemente el método enrichfilelevels (), pase la instancia de clase que implementa esta interfaz al método de constructor de la clase exportMaterialToZiptEmplate, y luego llame al método export () de la instancia de la clase exportaciónMaterialToZiptEpplate. Ahora mismo
NUEVA exportación de exportación de mierda (dtoParams,
enrichfilelevelsService, respuesta) .export ();
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.