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