Используйте режим итератора и режим комбинации для реализации экспорта и загрузки на Zip с сжатыми пакетами в браузере.
Из-за потребностей проекта я вспомнил шаблон дизайна, который я видел раньше, поэтому у меня была идея экспорта одного клика.
Идея проста и ясна. Просто посмотрите, как это шаг за шагом.
1. Создайте составной объект
открытый абстрактный класс FileComponent { / ** * Описание: рекурсивно создать папку, или файл * / public void mkfile () {бросить новый UnsupportedOperationException (); } / **! } / **! } / **! }}Этот комбинированный объект может быть объектом папки или определенным объектом файла. В последующем вызове нет необходимости знать, является ли это папкой или файлом (то есть прозрачностью комбинированного режима).
2. Реализация класса Abstract Composite Object
Реализация вышеуказанного абстрактного класса заключается в следующем:
public Class Zipfileitem Extends fileComponent {// Путь входного файла string inpath; // путь выходного файла string outpath; // Список информации о файле субнод <FileComponent> fileComponents = new ArrayList <FileComponent> (); // inpath может быть null public zipfileitem (string uppath) {this.outpath = Outpath; } // Путь исходного каталога сжатого файла и сжатого целевого местоположения public ZipfileItem (String inpath, String Outpath) {this.inpath = inpath; this.outpath = Outpath; } public void add (filecomponent filecomponent) {filecomponents.add (filecomponent); } public void remove (fileComponent fileComponent) {fileComponents.remove (fileComponent); } @Override public String getInpath () {return inpath; } @Override public String getOutPath () {return outpath; } @Override public void mkfile () {fileutils.createfile (inpath, enterpath); Итератор <filecomponent> iterator = filecomponents.iterator (); // Если это папка, вы также можете итерации над файлом и конкретным объектом файла в объекте, Whence (iterator.hasnext ()) {filecomponent filecomponent = iterator.next (); filecomponent.mkfile (); }}}3. Класс инструментов файлов
Public Class ConferenceFileutils { /** * Описание: Создайте файл в пути абсолютного вывода на основе абсолютного пути файла * @param Inpath Path. Если вы хотите создать его на основе существующего файла, то вы должны пройти * @param Outpath Path. Если это каталог, вы не используете */ public static void createfile (string inpath, string outpath) {filein = new File (inpath); File fileout = новый файл (Outpath); // Если целевой файл уже существует, игнорируйте его, если файл не существует. Затем создать if (! Fileout.exists ()) {int lastseparator = utpath.lastindexof (file.separator); String lastPart = utpath.substring (LastSeParator); // Если это не папка, создайте файл if (lastpart.lastindexof (".")! =-1) {loggerutil.info ("------------ Создание Contuctefile -------------"+Outpath); FileInputStream in = null; FileOutputStream OUT = null; File Directory = null; try {directory = new File (Outpath.substring (0, LastSeParator+1)); Directory.mkdirs (); out = new FileOutputStream (FileOut); // Если исходный файл существует if (filein.exists ()) {in = new FileInputStream (filein); int len; Byte [] buf = новый байт [10240]; while ((len = in.read (buf))> 0) {out.write (buf, 0, len); } out.close (); in.close (); in = null; }} catch (ioException e) {System.err.println ("Создание файла не удалось!", e); }} // Если это папка, создайте папку. Если папка родительского класса не существует, то создайте else { System.err.println ("--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Boolean Success = DeletEdir (New File (Dir, Children [i]); in null; (IoException e) {Выбросить новое ioexception (e);4. Core Export Logic Code
открытый класс ExportMaterialToziptemplate {@Resource private enichfilelevelsservice enichfilelevelsservice; // root Directory Wame или скачать имя файла браузера Private StringzyPname; // root Directory Adder Private String SavePath = "d: // tempfile"; // root Directory Path Private String SuperRootPath; // root cistory объект Private FileComponent Superroot; // бизнес -параметр dto private exportallthematerialdto paramdto; // Ответ частного ответа httpservletresponse; public exportmaterialtoziptemplate (exportallthematerialdto paramdto, enichfilelevelsservice enrichfilelevelsservice, httpservletresponse response) {this.downloadzipname = paramdto.getDownloadzipName (); this.paramdto = paramdto; this.Response = ответ; this.enrichfilelevelsservice = Enrichfilelevelsservice; this.superrootpath = savepath+file.separator+downloadzipname; this.superroot = new zipfileitem (superrootpath); } // 1. Инкапсулировать корневой каталог private void enchfilelevels () {enghfilelevelsservice.enrichfilelevels (superroot, superrootpath, paramdto); } // 2. Сгенерировать уровень каталога файлов, то есть создать все файлы (включая папки) private void reaallThefiles () {if (null! = Superroot) {superroot.mkfile (); }} // 3. После генерации уровня файла, затем сжатие его и загрузите в браузер private void compressanddownload () {file srcfile = new File (fortifyutil.filterfilename (superrootpath)); String TargetFilePath = savePath+file.separator+srcfile.getName ()+". Zip"; File TargetFile = новый файл (fortifyUtil.filterFilename (TargetFilePath)); Zipfileutil.zipfiles (srcfile, targetfile); try {// сжатие файла временного пути string downfilename = downloadzipname+". Zip"; response.reset (); // Определить выходной тип response.setContentType («Приложение/октет-поток»); response.setheader ("content-disposition", "Attachment; filename =" + new String (downfilename.getbytes ("gbk"), "iso-8859-1") + "; size =" + targetfile.length ()); Outputfileutil.outputfile (TargetFile, ответ); // Удалить папку временно хранится if (srcfile.exists ()) {conferencefileutils.deletedir (srcfile); } // Удалить временный сжатый пакет if (targetFile.exists ()) {targetFile.delete (); }} catch (ioException e) {devlog.error (e.getMessage ()); }} // one-щелчок экспорт, режим появления public void export () {EnrichFileLevels (); VEREALLTHEFILES (); CompressandDownload (); }}5. Обогащение интерфейсов уровня файлов
Общедоступный интерфейс Enrichfilelevelsservice {public void Enrichfilelevels (FileComponent Superroot, String SuperRootpath, ExportallTheMaterialDto ParamDTO);} В разных бизнес -сценариях просто реализуйте этот интерфейс, реализуйте метод Enrichfilelevels (), передайте экземпляр класса, который реализует этот интерфейс к методу конструктора класса ExportMaterialTozIptemplate, а затем вызовите метод export () метод ExportMaterialtozIpteMplate. Прямо сейчас
Новый exportmaterialtoziptemplate (dtoparams,
Enrichfilelevelsservice, ответ) .export ();
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.