Fastdfs功能-批量打包下載

本篇功能是基于Fastdfs文件上傳下載功能铃拇,作出的將文件打包成一個zip文件下載下來。
頁面效果如下


前臺界面.png

選擇行沈撞,點擊批量下載按鈕慷荔,然后就會將所有的文件打包成一個File.zip文件下載下來。解壓zip文件夾缠俺,就能看到里面包含了下載的所有文件显晶。這種下載方式不局限于xlsx文件贷岸,圖片格式,文本格式磷雇,Java文件等都可以使用這種方式下載下來偿警。

文件下載界面.png

前臺代碼

  //批量下載
            function downloadFunction() {
                var selected = grid.selectedDataItems();
                if(selected.length>0) {
                    kendo.ui.showConfirmDialog({
                        title: "提示",
                        message: "確定要下載?"
                    }).done(function(event) {
                        if (event.button == "OK") {
                            var recpIdList = new Array();
                            $.each(selected,function(i,v){
                                recpIdList.push(v.recpId);
                            });
                            debugger;
                            window.location.href="${base.contextPath}/ect/fut/receipt/batchDownload?recpIdList="+recpIdList;
                        }});
                }else{
                    kendo.ui.showWarningDialog({
                        message:"請至少選擇一行"
                    })
                }
            }

上述是批量下載功能函數(shù)唯笙,第一步是獲取所有行螟蒸,如果沒有選擇行,將彈出警告框“請至少選擇一行”睁本,第二步尿庐,根據(jù)所選行去查詢文件的服務(wù)器路徑以及文件名,假如路徑都為空呢堰,則下載一個空的zip文件抄瑟,不為空,則將文件打包成zip格式下載枉疼。

后臺代碼

List<ZipModel> zipModelList = new ArrayList<>();
for (Long recpId : recpIds) {
    FutReceipt futReceipt = new FutReceipt();
    futReceipt.setRecpId(recpId.floatValue());
    futReceipt = futReceiptMapper.selectByPrimaryKey(futReceipt);
    //todo:倉單表主鍵不能為空并且文件不能為空
    if (futReceipt.getRecpId() != null && futReceiptMapper.getFilePathById(futReceipt.getRecpId()) != null) {
        try {
            ZipModel zipModel = new ZipModel();
            String filePatch = getFilePatch(futReceipt, requestContext);
            //todo:存儲文件路徑
            zipModel.setFilePath(filePatch);
            //todo:獲取文件后綴皮假,并且將倉單批次作為文件名
            zipModel.setFileName(futReceipt.getBatchNum() + filePatch.substring(filePatch.indexOf(".") + 1));
            zipModelList.add(zipModel);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
//todo:設(shè)置打包后的文件名
String fileName = "File.zip";
//todo:臨時文件目錄,用于存儲打包的下載文件
String globalUploadPath = request.getSession().getServletContext().getRealPath("/");
String outFilePath = globalUploadPath + File.separator + fileName;
File file = new File(outFilePath);
//文件輸出流
FileOutputStream outStream = new FileOutputStream(file);
//壓縮流
ZipOutputStream toClient = new ZipOutputStream(outStream);
//todo:調(diào)用通用方法下載fastfds文件,打包成zip文件
ZipUtil.zipFile(zipModelList, toClient);
toClient.close();
outStream.close();
response.setHeader("content-disposition", "attachment;fileName=" + fileName);
//todo:將zip文件下載下來
ZipUtil.downloadZip(file, response);

實現(xiàn)步驟主要是將所有的fastdfs的文件路徑和文件名存儲到一個zipModelList對象中骂维。然后先調(diào)用通用方法zipFile將這些文件下載下來打包成一個zip文件惹资,放在一個臨時存儲位置,最后再通過通用方法downloadZip將文件下載下來航闺。

存儲數(shù)據(jù)對象
ZipModel.Java

public class ZipModel {

    /**
     * 文件名
     */
    private String fileName;

    /**
     * 文件在fastdfs文件服務(wù)器路徑
     */
    private String filePath;

    public String getFileName() {
        return fileName;
    }

    public void setFileName(String fileName) {
        this.fileName = fileName;
    }

    public String getFilePath() {
        return filePath;
    }

    public void setFilePath(String filePath) {
        this.filePath = filePath;
    }
}

通用生成下載zip方法
ZipUtil.Java


public class ZipUtil {
    private static String IFastdfsService = "hfastdfs.fastdfsfile.service.IFastdfsService";

    /**
     * 壓縮文件列表中的文件
     *
     * @param files
     * @param outputStream
     * @throws IOException
     * @throws ServletException
     */
    public static void zipFile(List<ZipModel> files, ZipOutputStream outputStream) throws IOException {
        try {
            int size = files.size();
            //壓縮列表中的文件
            for (int i = 0; i < size; i++) {
                ZipModel zipModel = files.get(i);
                try {
                    zipFile(zipModel, outputStream);
                } catch (Exception e) {
                    continue;
                }
            }
        } catch (Exception e) {
            throw e;
        }
    }

    /**
     * 將文件寫入到zip文件中
     *
     * @param zipModel
     * @param outputstream
     * @throws IOException
     * @throws ServletException
     */
    public static void zipFile(ZipModel zipModel, ZipOutputStream outputstream) throws AppException, IOException, MyException {
        try {
            if (zipModel != null && zipModel.getFilePath() != null && zipModel.getFileName() != null) {
                IFastdfsService iFastdfsService = (IFastdfsService) getBean(IFastdfsService);
                InputStream bInStream = new ByteArrayInputStream(iFastdfsService.getFile(zipModel.getFilePath()));
                ZipEntry entry = new ZipEntry(zipModel.getFileName());
                outputstream.putNextEntry(entry);

                final int MAX_BYTE = 10 * 1024 * 1024; //最大的流為10M
                long streamTotal = 0;      //接受流的容量
                int streamNum = 0;      //流需要分開的數(shù)量
                int leaveByte = 0;      //文件剩下的字符數(shù)
                byte[] inOutbyte;       //byte數(shù)組接受文件的數(shù)據(jù)

                streamTotal = bInStream.available();      //通過available方法取得流的最大字符數(shù)
                streamNum = (int) Math.floor(streamTotal / MAX_BYTE); //取得流文件需要分開的數(shù)量
                leaveByte = (int) streamTotal % MAX_BYTE;    //分開文件之后,剩余的數(shù)量

                if (streamNum > 0) {
                    for (int j = 0; j < streamNum; ++j) {
                        inOutbyte = new byte[MAX_BYTE];
                        //讀入流,保存在byte數(shù)組
                        bInStream.read(inOutbyte, 0, MAX_BYTE);
                        outputstream.write(inOutbyte, 0, MAX_BYTE); //寫出流
                    }
                }
                //寫出剩下的流數(shù)據(jù)
                inOutbyte = new byte[leaveByte];
                bInStream.read(inOutbyte, 0, leaveByte);
                outputstream.write(inOutbyte);
                outputstream.closeEntry(); 
                bInStream.close(); //關(guān)閉
            }
        } catch (IOException e) {
            throw e;
        }
    }

    /**
     * 下載打包的文件
     *
     * @param file
     * @param response
     */
    public static void downloadZip(File file, HttpServletResponse response) {
        try {
            if (!file.exists()) {
                file.createNewFile();
            }
            // 以流的形式下載文件褪测。
            BufferedInputStream fis = new BufferedInputStream(new FileInputStream(file.getPath()));
            byte[] buffer = new byte[fis.available()];
            fis.read(buffer);
            fis.close();
            // 清空response
            response.reset();

            OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
            response.setContentType("application/octet-stream");
            response.setHeader("Content-Disposition", "attachment;filename=" + file.getName());
            toClient.write(buffer);
            toClient.flush();
            toClient.close();
            file.delete();  //將生成的服務(wù)器端文件刪除
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

    /**
     * 獲得bean,通過ApplicationContext獲取
     *
     * @return
     */
    public static Object getBean(String className) {
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
        ServletContext sc = request.getSession().getServletContext();
        ApplicationContext ac = WebApplicationContextUtils.getRequiredWebApplicationContext(sc);
        Class c;
        try {
            c = Class.forName(className);
            return ac.getBean(c);
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }
}

以上就是fastdfs文件下載的全部方法

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市潦刃,隨后出現(xiàn)的幾起案子侮措,更是在濱河造成了極大的恐慌,老刑警劉巖乖杠,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件分扎,死亡現(xiàn)場離奇詭異,居然都是意外死亡胧洒,警方通過查閱死者的電腦和手機畏吓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來卫漫,“玉大人菲饼,你說我怎么就攤上這事⊙炊担” “怎么了巴粪?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我肛根,道長辫塌,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任派哲,我火速辦了婚禮臼氨,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘芭届。我一直安慰自己储矩,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布褂乍。 她就那樣靜靜地躺著持隧,像睡著了一般。 火紅的嫁衣襯著肌膚如雪逃片。 梳的紋絲不亂的頭發(fā)上屡拨,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天,我揣著相機與錄音褥实,去河邊找鬼呀狼。 笑死,一個胖子當(dāng)著我的面吹牛损离,可吹牛的內(nèi)容都是我干的哥艇。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼僻澎,長吁一口氣:“原來是場噩夢啊……” “哼貌踏!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起窟勃,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤哩俭,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后拳恋,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡砸捏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年谬运,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片垦藏。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡梆暖,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出掂骏,到底是詐尸還是另有隱情轰驳,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站级解,受9級特大地震影響冒黑,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜勤哗,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一抡爹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧芒划,春花似錦冬竟、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至拼苍,卻和暖如春笑诅,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背映屋。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工苟鸯, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人棚点。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓早处,卻偏偏與公主長得像,于是被迫代替她去往敵國和親瘫析。 傳聞我的和親對象是個殘疾皇子砌梆,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容