Gunakan mode Iterator dan mode kombinasi untuk mengimplementasikan ekspor satu klik dan unduh ke file paket terkompresi zip di browser
Karena kebutuhan proyek, saya ingat pola desain yang pernah saya lihat sebelumnya, jadi saya memiliki gagasan ekspor satu klik.
Idenya sederhana dan jelas. Tonton saja langkah demi langkah.
1. Buat objek gabungan
kelas public abstrak filecomponent { / ** * Deskripsi: secara rekursif membuat folder, atau file * / public void mkfile () {throw new UnsupportedOperPerationException (); } / ** * Deskripsi: Dapatkan jalur input file * / string publik getInpath () {throw new unsportedOperationException (); } / ** * Deskripsi: Dapatkan jalur output file * / string publik getOutPath () {throw new UnsuptedOperationException (); } / *** Deskripsi: Untuk folder, Anda dapat menambahkan folder atau file lain* / public void add (FileComponent FileComponent) {Throw New UnsupportedOperationException (); }}Objek kombinasi ini dapat berupa objek folder atau objek file tertentu. Dalam panggilan berikutnya, tidak perlu mengetahui apakah itu folder atau file (yaitu, transparansi mode kombinasi).
2. Implementasi kelas abstrak objek komposit
Implementasi kelas abstrak di atas adalah sebagai berikut:
ZipFileItem kelas publik memperluas filecomponent {// jalur input file string inpath; // jalur output file string outpath; // Daftar Informasi File Subnode <FILEComponent> FileComponents = NEW ARRAYLIST <FILEComponent> (); // inpath dapat null zipfileItem publik (string outpath) {this.outpath = outpath; } // Jalur direktori sumber dari file terkompresi dan lokasi target terkompresi publik zipfileItem (string inpath, string outpath) {this.inpath = inpath; this.outpath = outpath; } public void add (FileComponent FileComponent) {filecomponents.add (FileComponent); } public void hapus (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 (); // Jika itu adalah folder, Anda juga dapat mengulangi file dan objek file spesifik di objek while (iterator.hasnext ()) {filecomponent filecomponent = iterator.next (); filecomponent.mkfile (); }}}3. Kelas Alat File
Kelas Publik ConferenceFileutils { /** * Deskripsi: Buat file di jalur output absolut berdasarkan jalur absolut dari file * @param inpath input Path. Jika Anda ingin membuatnya berdasarkan file yang ada, maka Anda harus lulus * @param outpath output path. Jika ini adalah direktori, Anda tidak menggunakan */ public static void createFile (string inpath, string outpath) {file filein = file baru (inpath); File fileout = file baru (outpath); // Jika file target sudah ada, abaikan jika file tidak ada. Kemudian buat if (! Fileout.exists ()) {int lastSeParator = outpath.lastIndexof (file.separator); String lastpart = outpath.substring (lastseparator); // Jika ini bukan folder, buat file if (lastpart.lastIndexof (".")! =-1) {loggerutil.info ("------------ Membuat Concretefile -------------"+outpath); FileInputStream di = null; FileOutputStream out = null; Direktori File = NULL; coba {directory = file baru (outpath.substring (0, lastseparator+1)); direktori.mkdirs (); out = new fileoutputStream (fileout); // Jika file sumber ada jika (filein.exists ()) {in = new fileInputStream (filein); int len; byte [] buf = byte baru [10240]; while ((len = in.read (buf))> 0) {out.write (buf, 0, len); } out.close (); melampirkan(); di = null; }} catch (ioException e) {system.err.println ("Membuat file gagal!", e); }} // Jika itu adalah folder, buat folder. Jika folder kelas induk tidak ada, maka buat yang lain { System.err.println ("--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Boolean Success = DeletEdir (File baru (dir, anak -anak [i])); out = null; in.close ();4. Kode Logika Ekspor Inti
Ekspor PublicMaTerialToZiptemplate {@Resource Private EngrichfilelevelsService EnrichfilelelevelsService; // nama folder direktori root atau unduh nama file browser pribadi string downloadzipname; // alamat direktori root string private savePath = "d: // tempfile"; // Root Directory Path Private String Superrootpath; // Root Directory Object Private FileComponent Superroot; // Parameter Bisnis DTO Private ExportallTheMaTerialDTO Paramdto; // Respons Private HttpservletResponse Response; Ekspor PublikMaerialtoziptemplate (ExportAllTeMerialDTO Paramdto, EnrichFilelevelsService EnrichfilelevelsService, httpservletResponse response) {this.downloadzipname = paramdto.getDownLoadZipName (); this.paramdto = paramdto; this.response = respons; this.enrichfilelevelsservice = Enrichfilelevelsservice; this.superrootpath = savePath+file.separator+downloadzipname; this.superroot = zipfileItem baru (superrootpath); } // 1. Encapsulate direktori root void enrichfilelevels () {Enrichfilelevelsservice.enrichfilelevels (Superroot, Superrootpath, paramdto); } // 2. Hasilkan level direktori file, yaitu, buat semua file (termasuk folder) void createLthefile () {if (null! = Superroot) {superroot.mkfile (); }} // 3. Setelah menghasilkan level file, lalu kompres dan unduh ke browser private void compressandDownload () {file srcfile = file baru (fortifyutil.filterfilename (superrootpath)); String targetFilePath = savePath+file.separator+srcfile.getName ()+". Zip"; File targetFile = file baru (fortifyutil.filterfilename (targetFilePath)); Zipfileutil.zipfiles (srcfile, targetfile); coba {// compress file path sementara string downfileName = downloadzipname+". zip"; response.reset (); // Tentukan output type response.setContentType ("Application/Octet-stream"); response.setHeader ("konten-disposisi", "lampiran; fileName =" + string baru (downfileName.getbytes ("gbk"), "iso-8859-1") + "; size =" + targetFile.length ()); OutputFileutil.outputFile (TargetFile, Response); // hapus folder yang disimpan sementara IF (srcfile.exists ()) {conferenceuteutils.deletedir (srcfile); } // hapus paket terkompresi sementara jika (targetfile.exists ()) {targetfile.delete (); }} catch (ioException e) {devlog.error (e.getMessage ()); }} // Ekspor satu klik, mode penampilan public void export () {EnrichFilelevels (); createLtheFiles (); compressanddownload (); }}5. Antarmuka Level File Enrich
Antarmuka Publik EnrichFilelevelsService {public void EnrichFilelevels (FileComponent Superroot, String Superrootpath, ExportAllMerialDTO paramdto);} Dalam skenario bisnis yang berbeda, cukup implementasikan antarmuka ini, terapkan metode EnrichFilelevels (), lulus instance kelas yang mengimplementasikan antarmuka ini ke metode konstruktor dari kelas ExportMaterialtoziptemplate, dan kemudian memanggil metode Export () dari Contoh Kelas ExportMaterialToZiptemplate. Sekarang
Eksportasial baru yang bersuara (dtoparams,
EnrichfilelevelsService, respons) .Export ();
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.