亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

Java后臺實現瀏覽器一鍵導出下載zip壓縮包

2024-07-14 08:41:35
字體:
來源:轉載
供稿:網友

使用迭代器模式和組合模式實現瀏覽器一鍵導出下載為zip壓縮包文件

由于項目需要,于是又想起之前看過的設計模式,于是便有了一鍵導出的想法。 
思路簡單明了。一步一步看下去就好。

1.創建組合對象

public abstract class FileComponent {  /**   * Description:  遞歸創建文件夾,或者文件    */  public void mkFile(){    throw new UnsupportedOperationException();  }  /**   * Description:  獲取文件輸入路徑    */  public String getInPath(){    throw new UnsupportedOperationException();  }  /**   * Description:  獲取文件輸出路徑   */  public String getOutPath(){    throw new UnsupportedOperationException();  }  /**   * Description:  對于文件夾來說是可以add其他文件夾或者文件   */  public void add(FileComponent fileComponent){    throw new UnsupportedOperationException();  }}

此組合對象,可以是文件夾對象,也可是具體的文件對象,再后面調用中,不需要了解到底是一個文件夾還是一個文件(即組合模式的透明性)。

2.組合對象抽象類的實現

上述抽象類的實現如下:

public class ZipFileItem extends FileComponent{  //輸入文件的路徑  String inPath;  //輸出文件的路徑  String outPath;  //子節點文件信息  List<FileComponent> fileComponents = new ArrayList<FileComponent>();  //inPath 可以為null  public ZipFileItem(String outPath){      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, outPath);    Iterator<FileComponent> iterator = fileComponents.iterator();    //如果是文件夾,那么還可以迭代文件及對象中的具體文件對象    while (iterator.hasNext()) {      FileComponent fileComponent = iterator.next();      fileComponent.mkFile();    }  }}

3.文件工具類

public class ConferenceFileUtils {  /**   * Description:  根據文件的絕對路徑,在絕對的輸出路徑進行創建文件   * @param inPath  輸入路徑,如果是要根據已有的文件來創建,那么一定要傳   * @param outPath  輸出路徑,如果是目錄則不用   */  public static void createFile(String inPath,String outPath){    File fileIn = new File(inPath);    File fileOut = new File(outPath);      //如果目標文件已存在,則忽略,如果文件不存在 。則進行創建      if (!fileOut.exists()) {        int lastSeparator = outPath.lastIndexOf(File.separator);        String lastPart = outPath.substring(lastSeparator);        //如果不是文件夾,則創建文件        if (lastPart.lastIndexOf(".")!=-1) {          LoggerUtil.info("----------making concreteFile--------"+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=new 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("creating file failed!", e);              }        }        //如果是文件夾則創建文件夾,如果父類文件夾不存在,那么也創建          else {           System.err.println("----------making directory--------"+outPath);            fileOut.mkdirs();          }      }  }  //遞歸刪除文件夾以及文件  public static boolean deleteDir(File dir) {    if (dir.isDirectory()) {      String[] children = dir.list();      //遞歸刪除目錄中的子目錄      for (int i=0; i<children.length; i++) {        boolean success = deleteDir(new File(dir, children[i]));        if (!success) {          return false;        }      }    }    // 目錄此時為空,可以刪除    return dir.delete();  }  // 輸出文件對象到輸出流    public static void outputFile(File file, HttpServletResponse response) throws IOException {    OutputStream out=null;    FileInputStream in=null;    try {    byte[] src = new byte[1024];     out = response.getOutputStream();     in = new FileInputStream(file);    int len=0;    while ((len = in.read(src)) > 0) {      out.write(src, 0, len);    }    out.flush();    out.close();    in.close();    } catch (IOException e) {      throw new IOException(e);    }finally{      if(null!=out){        FortifyUtil.commonReleasedResource(out);      }      if(null!=in){        FortifyUtil.commonReleasedResource(in);      }    }  }}

4.核心導出邏輯代碼

public class exportMaterialToZipTemplate {  @Resource  private EnrichFileLevelsService enrichFileLevelsService;  //根目錄文件夾名稱 or 下載瀏覽器文件名  private String downloadZipName;  //根目錄地址  private String savePath = "d://tempFile";  //根目錄路徑  private String superRootPath;  //根目錄對象  private FileComponent superRoot;  //業務參數DTO  private ExportAllTheMaterialDTO paramDTO;  //response  private HttpServletResponse response;  public exportMaterialToZipTemplate(ExportAllTheMaterialDTO paramDTO,EnrichFileLevelsService enrichFileLevelsService,HttpServletResponse response) {    this.downloadZipName = paramDTO.getDownloadZipName();    this.paramDTO = paramDTO;    this.response = response;    this.enrichFileLevelsService = enrichFileLevelsService;    this.superRootPath =savePath+File.separator+downloadZipName;    this.superRoot = new ZipFileItem(superRootPath);   }    //1.封裝根目錄  private void enrichFileLevels(){    enrichFileLevelsService.enrichFileLevels(superRoot,superRootPath,paramDTO);  }  //2.生成文件目錄層級,即創建所有的文件(包括文件夾)  private void createAllTheFiles(){    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 = new File(FortifyUtil.filterFileName(targetFilePath));    ZipFileUtil.zipFiles(srcFile,targetFile);    try {      //壓縮文件臨時路徑      String downFileName = downloadZipName+".zip";      response.reset();      // 定義輸出類型      response.setContentType("application/octet-stream");      response.setHeader("content-disposition", "attachment;filename="          + new String(downFileName.getBytes("GBK"), "ISO-8859-1")          + ";size=" + targetFile.length());      OutputFileUtil.outputFile(targetFile, response);      // 刪除臨時存放的文件夾      if (srcFile.exists()) {        ConferenceFileUtils.deleteDir(srcFile);      }      //刪除臨時的壓縮包      if (targetFile.exists()) {        targetFile.delete();      }    } catch (IOException e) {      DevLog.error(e.getMessage());    }  }  //一鍵導出,外觀模式  public void export() {    enrichFileLevels();    createAllTheFiles();    compressAndDownload();  }}

5.豐富文件層級的接口

public interface EnrichFileLevelsService {  public void enrichFileLevels(FileComponent superRoot,String superRootPath,ExportAllTheMaterialDTO paramDTO);}

不同的業務場景只要實現這接口,實現enrichFileLevels()方法,將實現此接口的 
類實例傳到exportMaterialToZipTemplate類的構造方法,然后調用exportMaterialToZipTemplate類實例的export()方法即可。即 

new exportMaterialToZipTemplate(dtoParams, 
enrichFileLevelsService, response).export();

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美成人精品在线播放| 色小说视频一区| 欧美丰满少妇xxxxx| 国产精品美女主播在线观看纯欲| 亚洲丝袜在线视频| 欧美日韩亚洲视频一区| 国产98色在线| 亚洲男人天堂手机在线| 欧美成人国产va精品日本一级| 欧美亚州一区二区三区| 午夜精品一区二区三区视频免费看| 国产精品亚洲一区二区三区| 国产精品一二区| 亚洲free性xxxx护士白浆| 性色av香蕉一区二区| 亚洲影院色在线观看免费| 精品偷拍各种wc美女嘘嘘| 欧美激情精品久久久久久大尺度| 亚洲欧美日韩国产成人| 欧美日韩中文在线观看| 国内精久久久久久久久久人| 久久久久这里只有精品| 久久久久久久久久久久av| 亚洲欧洲日本专区| 国产精品一区av| 久久好看免费视频| 91精品国产99| 成人激情在线播放| 国产在线播放不卡| 91九色视频导航| 伊人一区二区三区久久精品| 国产精品久久久久久久久久三级| 欧美日韩一区二区免费在线观看| 日韩电影中文字幕在线| 欧美一级片免费在线| 亚洲精品国产精品乱码不99按摩| 日韩av资源在线播放| 国产亚洲人成a一在线v站| 俺去了亚洲欧美日韩| 色综合亚洲精品激情狠狠| 91香蕉嫩草神马影院在线观看| 亚洲精品98久久久久久中文字幕| 国产区亚洲区欧美区| 国产一区二区av| 国产欧美精品久久久| 91中文精品字幕在线视频| 亚洲欧美日韩一区在线| 亚洲成人av在线播放| 国内精品久久久久久影视8| 中文字幕免费国产精品| 欧美激情欧美激情在线五月| 久久免费观看视频| 91欧美精品午夜性色福利在线| 欧美第一黄网免费网站| 亚洲第一av网| 亚洲国产天堂久久综合| 亚洲精品电影在线观看| 97精品国产97久久久久久春色| 日韩av综合网站| 欧美国产日韩二区| 亚洲美女av在线| www.日韩欧美| 91性高湖久久久久久久久_久久99| 97激碰免费视频| 国产精品国语对白| 国产日韩精品在线播放| 亚洲a区在线视频| 精品中文字幕在线观看| 国产精品久在线观看| 国产精品成人av在线| 欧美人与物videos| 日韩69视频在线观看| 欧日韩不卡在线视频| 欧美日韩综合视频| 午夜精品美女自拍福到在线| 97视频网站入口| 在线看日韩av| 日本亚洲欧洲色α| 国产精品美女网站| 国产精品一区二区三| 91精品国产高清久久久久久久久| 欧美激情按摩在线| 亚洲乱码一区av黑人高潮| 亚洲国产成人91精品| 色综合久久精品亚洲国产| 自拍视频国产精品| 亚洲第一精品夜夜躁人人躁| 国产精品视频一区国模私拍| 国产精品第七十二页| 精品久久久久久久久久ntr影视| 欧美日韩激情视频8区| 亚洲国产私拍精品国模在线观看| 亚洲摸下面视频| 亚洲自拍偷拍区| 亚洲高清福利视频| 久久亚洲国产精品成人av秋霞| 日韩大片在线观看视频| 日韩国产一区三区| 国产精品男人的天堂| 在线日韩第一页| 欧美一级在线亚洲天堂| 亚洲欧洲在线看| 97视频免费在线看| 最近2019年日本中文免费字幕| 日韩国产一区三区| 国产精品久久久久久搜索| 欧美精品电影在线| 成人深夜直播免费观看| 久久在线免费观看视频| 欧美午夜性色大片在线观看| 欧美日韩午夜激情| 亚洲一区www| 亚洲美女福利视频网站| 一区二区亚洲精品国产| www.日本久久久久com.| 性欧美办公室18xxxxhd| 日韩的一区二区| 亚洲欧美另类自拍| 国产精品成人免费电影| 亚洲天堂第一页| 亚洲最新视频在线| 久久天堂电影网| 欧美性资源免费| 78色国产精品| 国产视频久久久久| 日本久久久久久久久| 久久久久久中文字幕| 伦伦影院午夜日韩欧美限制| 国产成人免费91av在线| 亚洲综合一区二区不卡| 国产精品网红福利| 在线播放日韩专区| 日本久久91av| 亚洲精品电影久久久| 91视频88av| 播播国产欧美激情| 久久久精品美女| 欧美日韩一区二区三区在线免费观看| 久久精品亚洲国产| 亚洲精品视频在线播放| 欧美激情日韩图片| 欧美日韩免费在线观看| 午夜精品一区二区三区av| 精品美女永久免费视频| 亚洲v日韩v综合v精品v| 亚洲国产精品专区久久| 日本欧美中文字幕| 欧美在线视频在线播放完整版免费观看| 亚洲丁香婷深爱综合| 欧洲s码亚洲m码精品一区| 亚洲新声在线观看| 日韩精品极品在线观看播放免费视频| 亚洲欧美一区二区激情| 国产精品九九久久久久久久| 日韩av在线天堂网| 日韩欧美在线中文字幕| 欧美午夜精品伦理| 日韩中文理论片| 国产伦精品一区二区三区精品视频| 国产精品久久久久一区二区| 精品激情国产视频| 欧美日韩加勒比精品一区| 亚洲大胆人体视频| 日本在线观看天堂男亚洲|