1. 程式人生 > >Java後臺實現瀏覽器一鍵匯出下載zip壓縮包

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

使用迭代器模式和組合模式實現瀏覽器一鍵匯出下載為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();

相關推薦

Java後臺實現瀏覽器匯出下載zip壓縮

使用迭代器模式和組合模式實現瀏覽器一鍵匯出下載為zip壓縮包檔案 由於專案需要,於是又想起之前看過的設計模式,於是便有了一鍵匯出的想法。 思路簡單明瞭。一步一步看下去就好。 1.建立組合物件 public abstract class FileC

Java Servlet實現檔案上傳並讀取Zip壓縮中檔案的真實型別

1.上傳檔案servlet PS: 使用ant.jar中的 org.apache.tools.zip.ZipEntry 物件,防止亂碼 package com.chenl.servlets; import java.io.File; import java.io.IOExcep

java 自己實現專案全轉碼 解決檔案亂碼問題

經常在使用外部匯入的專案,開啟之後想學習一番,結果發現所有註釋都亂碼,看起來很頭疼,這個問題困擾我很久,相信大家在學習過程中也會遇到。所以昨晚寫了一個小程式,只要輸入專案檔案的根目錄,可以實現專案內所有java檔案自動轉碼的功能。預設是從GBK轉碼為UTF-8。 首先聊聊正

java後臺實現excel檔案下載功能

    java中對於excel檔案的操作,有讀取,寫入,上傳等功能,在對excel檔案進行操作時,為了讓使用者更加直觀的製作excel資料,必然會有下載模板excel檔案功能, 這裡以學生基本資訊模板excel檔案為例,實現對指定路徑下的excel檔案進行下載的後臺程式碼。

Java後臺實現檔案下載功能

專案中使用的框架是SpringMVC+MyBatis 在專案中需要做一個功能。就是一個報表。然後根據報表生成一個csv格式的檔案。然後進行壓縮。並提供下載功能。 該“Excel下載” 功能的業務邏輯是當點選該按鈕。則需要把報表頁面上顯示的資料進行生成一個

java後臺判斷瀏覽器的版本

cas nbsp sta header [] ade get tolower ie10 public static void main(String[] args) { String agent=request.getHeader("User-Ag

自開發自動拉群微信雲控系統,可實現全自動拉群

tco key return cati 劃線 除了 com off shm 微信自動拉群雲控系統源碼,全自動一鍵拉群。自動統計新加的好友,自動將所有新加好友一鍵拉群。服務器端下發群二維碼,手機端一鍵拉群。全自動大批量,同時拉群。 在系統的開發實現過程中,除了服務器端推送指

Java POI實現excel大數據量下載

spec member 數據量 system pac 空字符 ger ima bin 最近,在做一個數據導出的功能,需求描述如下: 當用戶在頁面點擊“搜索”,查詢符合條件的記錄,然後點擊導出,實現excel文件下載,直接輸出到瀏覽器,保存文件到本地。 需求分析 滿足需求基

小程式 - 實現複製】功能

小程式 - 實現【一鍵複製】功能 為啥想起使用【一鍵複製】功能?因為個人小程式裡,不許加外連結,很是頭疼,就想到一鍵複製連結,這是我剛寫的一個減一的小程式: 使用【一鍵複製】: wxml 檔案: <view> 官網:<text selectable='true' bin

java 後臺掛載apk檔案供前端下載

/**      * App下載介面,以位元組流的形式返回apk      */     @RequestMapping("/download")     @ResponseBod

微信跳轉,手機WAP瀏覽器超級跳轉微信指定頁面

微信跳轉,手機WAP瀏覽器一鍵超級跳轉微信指定頁面 這篇文章主要介紹瞭如何在手機瀏覽器wap網頁中點選連結跳轉到微信介面,需要的朋友可以參考下先說第一種,最簡單的喚起微信協議,weixin://主流瀏覽器都支援,app加個瀏覽器功能就可以使用weixin:// 。用途不大,只能開啟微信,不能攜帶任何引數。方

自動下載百度美女圖片

我一直認為學習一個新東西成就感和興趣很重要,前面幾篇文章介紹了python的安裝和使用,這篇文章以一個圖片爬蟲指令碼例子來感受下python的魅力。大家可以參考之前關於python安裝的文章複製並執行下面這個python指令碼,同時為了方便更多小白讀者快速體驗python爬蟲,我把文章中的pyt

ant指令碼實現jenkins打包javaweb專案

1.在myeclipse中ant指令碼打包成功後部署可以正常訪問,在jenkins中打包後部署無法正常訪問,一樣的ant指令碼,啟動tomcat後報錯缺少配置檔案,對比兩個war包發現jenkins打的war中classes資料夾下面沒有src下的配置檔案,手動增加ant指令碼拷貝所有配置檔案的資料

微信小程式+java後臺實現登入(java操作)

登入,在微信小程式上面稱為當一個使用者使用該小程式,進入到小程式中,我們拿到該使用者的資訊,進行一系列的操作,並記錄下來。 微信小程式與java介面實現登入操作,大致思路如下: 1.微信小程式端通過呼叫對應的api,將對應的變數傳入後臺(code、iv、encr

Shell指令碼實現軟體安裝和自動重啟()

前言 在LINUX開發過程中,往往需要對已經開發好的軟體進行打包,一鍵安裝後程序能自動後臺啟動,當程序意外關閉後能自動重啟,本篇來介紹實現過程。 業務分析 對功能進行拆分 1、實現程式後臺執行,掛掉重啟的監聽器指令碼 2、將監聽器指令碼放入開機啟動項 3、實現軟體

java實現MongoDB主自增

java中實現MongoDB主鍵自增 1.定義序列實體類SeqInfo: 儲存每個集合的ID記錄 //@Document 把一個java類宣告為mongodb的文件,可以通過collection引數指定這個類對應的文件 @Document(collection = "se

Java後臺實現小程式微信支付

本人第一篇部落格,之前筆記一直放在有道雲,想寫部落格很久了,一直沒下定決心,也沒靜下心好好寫,今天突然跟朋友談 到平時工作根本沒時間學習、整理、總結balabala,工作中遇到的問題很多會經常遇到,不整理總結第二次碰到又要半天,就這麼扯吧扯吧,扯完之後,不知道哪來的決心,就下手了,哈哈,廢話

JAVA實現多檔案以ZIP壓縮匯出

1、使用java實現吧伺服器的圖片打包成一個zip格式的壓縮包匯出,多個檔案打包匯出。  2、程式碼如下: **ImageByteUtil.java** public class ImageByteUtil{     private static float Q

和我一起實現EditText清空功能

序 在實際專案中我們經常看到這樣的效果: 這就是我們常說的一鍵清除功能,Android並沒有自帶的API供我們使用,所以我們需要自己來編寫,下面我將介紹常見實現方式. 1.常見的實現方式 在EditText的基礎上進行拓展,俗稱

360極速瀏覽器操作 訂單速記表selenium +requests爬取 openpyxl +xlrd 操作excel

#coding:utf-8 #配置前先將谷歌的chromedriver放到 360瀏覽器的目錄下 from selenium.webdriver.common.by import By #引入判斷元素載入模組 from selenium.webdriver.support.ui import W