Use o modo iterador e o modo de combinação para implementar exportação com um clique e download para zip arquivos de pacote compactados no navegador
Por causa das necessidades do projeto, lembrei-me do padrão de design que já tinha visto antes, então tive a idéia de exportação com um clique.
A ideia é simples e clara. Apenas observe passo a passo.
1. Crie um objeto composto
classe public abstrata FileComponent { / ** * Descrição: Crie recursivamente uma pasta ou arquivo * / public void mkfile () {lança new UnsupportEdOperationException (); } / ** * Descrição: Obtenha o caminho de entrada do arquivo * / public String getInpath () {lança novo UnsupportEdOperationException (); } / ** * Descrição: Obtenha o caminho de saída do arquivo * / public String getoutPath () {lança novo UnsupportEdOperationException (); } / *** Descrição: Para pastas, você pode adicionar outras pastas ou arquivos* / public void Add (FileComponent FileComponent) {THROW NOVA UNSUPPORTEDOPERATIONECCECTION (); }}Esse objeto de combinação pode ser um objeto de pasta ou um objeto de arquivo específico. Na chamada subsequente, não há necessidade de saber se é uma pasta ou um arquivo (ou seja, a transparência do modo de combinação).
2. Implementação da classe abstrata de objeto composto
A implementação da classe abstrata acima é a seguinte:
classe pública ZipFileItem estende o FileComponent {// Caminho do arquivo de entrada String inPath; // caminho do arquivo de saída string outpath; // Lista de informações do arquivo de subnodo <CeComponent> fileComponents = new ArrayList <ComComponent> (); // inPath pode ser nulo zipfileitem (string outpath) {this.outPath = outpath; } // O caminho do diretório de origem do arquivo compactado e o local de destino compactado public zipfileitem (string inpath, string outpath) {this.inpath = inPath; this.outPath = Outpath; } public void Add (FileComponent FileComponent) {FileComponents.add (FileComponent); } public void Remover (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 (); // Se for uma pasta, você também pode iterar sobre o arquivo e o objeto de arquivo específico no objeto while (iterator.hasnext ()) {filecomponent FileComponent = iterator.Next (); filecomponent.mkfile (); }}}3. Classe de ferramenta de arquivo
Classe public ConferenceFileUtils { /** * Descrição: Crie um arquivo no caminho de saída absoluto com base no caminho absoluto do arquivo * @param inpath de entrada. Se você deseja criá -lo com base em um arquivo existente, você deve passar * @param Outpath Outpath Path. Se for um diretório, você não usa */ public static void createfile (string inPath, string outpath) {fileIningin = new File (inPath); Arquivo fileout = novo arquivo (outpath); // Se já existir o arquivo de destino, ignore -o se o arquivo não existir. Em seguida, crie if (! Fileout.exists ()) {int lastSeparator = outpath.LastIndexOf (file.separator); String lastPart = outpath.substring (lastseparator); // Se não for uma pasta, crie o arquivo if (lastPart.LastIndexof (".")! =-1) {LoggerItil.info ("------------ fazendo concreto -----------"+Outpath); FileInputStream em = null; FileOutputStream Out = NULL; Diretório de arquivos = nulo; tente {diretório = novo arquivo (outpath.substring (0, lastseparator+1)); diretório.mkdirs (); out = new FileOutputStream (fileout); // se o arquivo de origem existir if (fileIn.exists ()) {in = new FileInputStream (filein); int len; byte [] buf = novo 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 ("Criando o arquivo falhou!", e); }} // Se for uma pasta, crie uma pasta. Se a pasta da classe pai não existir, crie um else { System.err.println ("---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- BOOLEANS SUCCESSO = DELETEDIR (NOVO FILHO, CRIANÇAS [I]); EM = NULL; (Ioexception e) {tiro a nova ioexception (e);4. Código lógico de exportação do núcleo
classe pública ExportMaterialTozipTemplate {@Resource Private EnrichFileLevelSservice enrichFileLevelSservice; // Nome da pasta do diretório raiz ou download Nome do arquivo do navegador Private String DownloadzipName; // Endereço do diretório raiz Private String savePath = "d: // tempfile"; // ROOT Directory Path String Private String SuperrootPath; // objeto de diretório raiz privado filecomponent superroot; // Parâmetro de negócios DTO Exportação privadalThematerialDto paramdto; // Resposta Resposta privada httpServletResponse; public ExportMaterialTozipTemplate (ExportAllThematerialDTO paramdto, enrichfilelevelSservice enrichFileLevelSservice, httpServLetResponse resposta) {this.DownloadzipName = paramddtoDownloadzipName (); this.paramdto = paramdto; this.Response = resposta; this.enrichFileLevelSservice = enrichfilelevelSservice; this.superrootpath = salvAth+file.separator+DownloadzipName; this.superroot = new ZipFileItem (superrootPath); } // 1. Encapsular o diretório raiz private void enrichfilelevels () {enrichfilelevelssservice.enrichfilelevels (superroot, superrootpath, paramdto); } // 2. Gere o nível do diretório de arquivos, ou seja, crie todos os arquivos (incluindo pastas) private void createAllthefiles () {if (null! = Superroot) {superroot.mkfile (); }} // 3. Depois de gerar o nível do arquivo, compacte -o e faça o download no navegador privado void compressãoDownload () {file srcfile = new arquivo (fortifyutil.filterfilename (superrootpath)); String TargetFilePath = SalvePath+File.separator+srcfile.getName ()+". Zip"; Arquivo TargetFile = novo arquivo (fortifyutil.filterfilename (TargetFilePath)); ZipfileUtil.zipfiles (SRCFile, TargetFile); tente {// compactar o arquivo de arquivo temporário string downfilename = downloadzipname+". zip"; Response.Reset (); // Defina o tipo de saída Response.SetContentType ("Application/Octet-Stream"); Response.setheader ("Content-Disposition", "Applement; filename =" + new String (DownFilename.getBytes ("GBK"), "ISO-8859-1") + "; size =" + TargetFile.length ()); OutputFileUtil.OutputFile (TargetFile, Response); // Exclua a pasta armazenada temporariamente se (srcfile.exists ()) {confencefileutils.deletedir (srcfile); } // Exclua o pacote compactado temporário se (TargetFile.Exists ()) {TargetFile.Delete (); }} catch (ioexception e) {devLog.error (e.getMessage ()); }} // Exportação com um clique, Modo de aparência public void export () {enrichfilelevels (); createAllthefiles (); compressandDownload (); }}5. Enriquece interfaces no nível do arquivo
interface pública enrichfilelevelSservice {public void enrichfilelevels (FileComponent superroot, string superrootpath, exportallthematerialdto paramdto);} Em diferentes cenários de negócios, basta implementar essa interface, implementar o método enrichfilelevels (), passe na instância da classe que implementa essa interface ao método construtor da classe ExportMaterialTozipTemplate e, em seguida, chama o método export () da instância da classe ExportMaterialTozipTemplate. Agora mesmo
NOVO EXPORTMATERIALTOZIPTEMPLATE (DTOPARAMS,
enrichfilelevelSservice, resposta) .Export ();
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.