国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

java 批量下載將多個文件(minio中存儲)壓縮成一個zip包

這篇具有很好參考價值的文章主要介紹了java 批量下載將多個文件(minio中存儲)壓縮成一個zip包。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

我的需求是將minio中存儲的文件按照查詢條件查詢出來統(tǒng)一壓成一個zip包然后下載下來。

思路:針對這個需求,其實可以有多個思路,不過也大同小異,一般都是后端返回流文件前端再處理下載,也有少數(shù)是壓縮成zip包之后直接給下載鏈接返回到前端,前端收到鏈接url直接window.open()進(jìn)行下載,不過這種下載zip包的路徑要確保是在網(wǎng)站下,否則訪問不到,還有一個缺點就是文件沒法刪除,占用存儲空間,后期需人為動作清理,選擇哪種思路就可以看具體需求啦,我選擇的是第一種思路,以下就針對第一種后端返回流方式進(jìn)行具體介紹。

首先說第一種方法:將需要下載的文件找到,minio中有查詢方法將文件轉(zhuǎn)成inputStream,這里就不多說了,拿到一組InputStream,我們就可以寫入一個zip包里了,創(chuàng)建臨時zip路徑,將流遍歷寫入文件,讀取臨時zip文件再寫入response中的outputStream,最后刪除臨時文件。

前端處理方法最后統(tǒng)一介紹,后端核心代碼如下:

public void downloadZip(String name, List<MediaFileEntity> filePaths,HttpServletResponse     response){
        File zipFile = compressedFileToZip(name,filePaths);
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        try {
            FileInputStream ins = new FileInputStream(zipFile);
            WritableByteChannel writableByteChannel = Channels.newChannel(os);
            FileChannel fileChannel = ins.getChannel();
            fileChannel.transferTo(0, fileChannel.size(), writableByteChannel);
            fileChannel.close();
            response.setCharacterEncoding("UTF-8");
            name = URLEncoder.encode(name, "UTF-8");
            response.setContentType("application/octet-stream");
            response.addHeader("Content-Disposition", "attachment;filename=" + new String(name.getBytes("iso8859-1")));
            response.setContentLength(os.size());
            response.setHeader("filename", name);
            response.addHeader("Content-Length", "" + os.size());
            var outputstream = response.getOutputStream();
            os.writeTo(outputstream);
            os.flush();
            os.close();
            outputstream.flush();
            outputstream.close();
            writableByteChannel.close();
            if(zipFile.exists()){
                //刪除臨時文件
                zipFile.delete();
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                os.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    /**
     * 構(gòu)建臨時zip文件
     **/
    public File compressedFileToZip(String name, List<MediaFileEntity> mediaFileEntityList) {
        String zipName = name.concat(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))).concat(".zip");
        //臨時zip路徑
        String fileZipPath = System.getProperty("user.dir").concat("/").concat(zipName);
        OutputStream os = null;
        ZipOutputStream zos = null;
        File file = new File(fileZipPath);
        try {
            if(!file.exists()){
                file.createNewFile();
            }
            os= new FileOutputStream(file);
            zos = new ZipOutputStream(os) ;
            for (MediaFileEntity entity:mediaFileEntityList
                 ) {
                zos.putNextEntry(new ZipEntry(entity.getFileName()));
                //minio 獲取流
                InputStream ins = ossService.getObject(OssConfiguration.bucket,entity.getObjectKey());
                FileInputStream insf=convertToFileInputStream(ins);
                WritableByteChannel writableByteChannel = Channels.newChannel(zos);
                FileChannel fileChannel = insf.getChannel();
                fileChannel.transferTo(0, fileChannel.size(), writableByteChannel);
                zos.closeEntry();
                fileChannel.close();
                ins.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if(zos != null){
                try {
                    zos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(os != null){
                try {
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return file;
    }

第二種方法:安裝hutool依賴,調(diào)用hutool包中的ZipUtil工具類中的zip方法進(jìn)行下載,。此方法需要有3個參數(shù),分別是OutoutStream,每個流對應(yīng)的文件名字符串?dāng)?shù)組,文件的InputStream數(shù)組。

java 批量下載將多個文件(minio中存儲)壓縮成一個zip包,java,vue.js,javascript,spring boot

首先將需要下載的文件找到,拿到一組InputStream,也就是zip方法中的第3個參數(shù),第一個參數(shù)顧名思義就是你想要輸出的地方,我們是返回給前端所以就是response.getOutputStream(),第二個參數(shù)我們遍歷文件時也可以拿到,廢話不多說了,上代碼看吧。

在項目下安裝hutool依賴

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.5.7</version>
</dependency>
  /**
     * 下載多個文件轉(zhuǎn)zip壓縮包
     *
     * @param mediaFileEntityList
     * @param response
     * @throws Exception
     */
    public void dowloadToZip(List<MediaFileEntity> mediaFileEntityList, HttpServletResponse response) throws Exception {

        int i = 0;
        //如果有附件 進(jìn)行zip處理
        if (mediaFileEntityList != null && mediaFileEntityList.size() > 0) {
            try {
                //被壓縮文件流集合
                InputStream[] srcFiles = new InputStream[mediaFileEntityList.size()];
                //被壓縮文件名稱
                String[] srcFileNames = new String[mediaFileEntityList.size()];
                for (MediaFileEntity entity : mediaFileEntityList) {
                    //以下代碼為獲取圖片inputStream
                    InputStream ins = ossService.getObject(OssConfiguration.bucket,entity.getObjectKey());
                    if (ins == null) {
                        continue;
                    }
                    //塞入流數(shù)組中
                    srcFiles[i] = ins;
                    srcFileNames[i] = entity.getFileName();
                    i++;
                }
                response.setCharacterEncoding("UTF-8");
                response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("下載.zip", "UTF-8"));
                //多個文件壓縮成壓縮包返回
                ZipUtil.zip(response.getOutputStream(), srcFileNames, srcFiles);
            } catch (IOException e) {
                    e.printStackTrace();
            }
        }

    }

Controller這邊可以直接寫成沒有返回值的接口,我的例子如下,僅供參考:

    @GetMapping("/{workspace_id}/fileDownList")
    @ApiOperation(value = "查詢文件的下載地址")
    public void getFileStreamList(@PathVariable(name = "workspace_id") String workspaceId,
                                  @RequestParam(name = "ids") String ids, HttpServletResponse response) throws Exception {

        List<Integer> fileIds= Arrays.stream(ids.split(",")).collect(Collectors.toList()).stream()
                .map(Integer::parseInt)
                .collect(Collectors.toList());
        List<MediaFileEntity> mediaFileEntityList = fileService.getMediaListById(workspaceId, fileIds);
//        fileUtil.downloadZip("111",mediaFileEntityList,response);//第一種方法
        fileUtil.dowloadToZip(mediaFileEntityList,response);//第二種方法
    }

?到此,后端zip下載就完畢了,下面我們說說前端如何處理

網(wǎng)上查詢前端處理大致都是如下,但是我自己使用的時候下載總是提示損壞,后找了一個工具類直接調(diào)用,就可以了,示例代碼請求是get,如需調(diào)整,可根據(jù)情況自行調(diào)整

核心代碼如下:

import { saveAs } from 'file-saver';    
const baseURL = (window as any).config.VITE_APP_BASE_API; //import.meta.env.VITE_APP_BASE_API;

export default {
zip(url: string, name: string) {
        url = baseURL + url;
        axios({
            method: 'get',
            url: url,
            responseType: 'blob',
            headers: { Authorization: 'Bearer ' + getToken() },
        }).then(res => {
            const isBlob = blobValidate(res.data);
            if (isBlob) {
                const blob = new Blob([res.data], { type: 'application/zip' });
                this.saveAs(blob, name);
            } else {
                this.printErrMsg(res.data);
            }
        });
    },
    saveAs(text: any, name: string, opts?: any) {
        saveAs(text, name, opts);
    },
    async printErrMsg(data: any) {
        const resText = await data.text();
        const rspObj = JSON.parse(resText);
        const errMsg = errorCode[rspObj.code] || rspObj.msg || errorCode['default'];
        // ElMessage.error(errMsg);
    },
    blobValidate(data: any) {
        return data.type !== 'application/json';
    }
};

按鈕綁定方法直接調(diào)用zip下載方法,傳參為url和要導(dǎo)出zip的名稱,示例如下:文章來源地址http://www.zghlxwxcb.cn/news/detail-687186.html

import download from '@/plugins/download';

function batchDownload(){
    ElMessage.success("文件下載中,請勿重復(fù)點擊!");
    download.zip(`/media/api/v1/files/${workspaceId}/fileDownList?ids=${selectlist.value.join(",")}`,"MediaFiles"+new Date().toLocaleDateString()+".zip")

}

到了這里,關(guān)于java 批量下載將多個文件(minio中存儲)壓縮成一個zip包的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • java~將多個輸出流壓縮成一個zip文件

    hutool工具包可以幫我們完成這件事,幾行代碼可以實現(xiàn),我們提供兩種方式,壓縮本地文件和壓縮內(nèi)存流。 擴(kuò)展閱讀:如果希望進(jìn)行模版技術(shù),可以看一下org.apache.velocity.tools:velocity-tools-generic包,可直接引用依賴 *版本 引用依賴 org.apache.velocity 是 Apache Velocity 模板引擎的 Ja

    2024年02月05日
    瀏覽(25)
  • Java實現(xiàn)打包壓縮文件或文件夾生成zip以實現(xiàn)多文件批量下載

    Java實現(xiàn)打包壓縮文件或文件夾生成zip以實現(xiàn)多文件批量下載

    有時候在系統(tǒng)中需要一次性下載多個文件,但逐個下載文件比較麻煩。這時候,最好的解決辦法是將所有文件打包成一個壓縮文件,然后下載這個壓縮文件,這樣就可以一次性獲取所有所需的文件了。 下面是一個名為CompressUtil的工具類的代碼,它提供了一些方法來處理文件壓

    2024年02月06日
    瀏覽(32)
  • SpringBoot整合minio,文件的上傳下載,批量獲取

    Minio是GlusterFS創(chuàng)始人之一Anand Babu Periasamy發(fā)布新的開源項目?;贏pache License v2.0開源協(xié)議的對象存儲項目,采用Golang實現(xiàn),客戶端支Java,Python,Javacript, Golang語言。 其設(shè)計的主要目標(biāo)是作為私有云對象存儲的標(biāo)準(zhǔn)方案。主要用于存儲海量的圖片,視頻,文檔等。非常適合于存儲

    2024年02月12日
    瀏覽(30)
  • js 實現(xiàn)多個文件循環(huán)下載 批量下載

    最近業(yè)務(wù)涉及勾選之后多個word文件下載 開始用的循環(huán)方式 怎么試都是下載最后一個文件 后來找到原因是 當(dāng)循環(huán)執(zhí)行下載的時候,幾個下載命令連續(xù)執(zhí)行的時候,瀏覽器會取消上一個下載,直接下載最后一個文件 。所以要加一個定時器,讓幾個連續(xù)的下載請求之間有時間間

    2024年02月11日
    瀏覽(26)
  • 【分布式文件存儲】MinIO部署及實現(xiàn)文件上傳下載

    【分布式文件存儲】MinIO部署及實現(xiàn)文件上傳下載

    目錄 概述 MinIO集群部署 準(zhǔn)備docker-compose.yml 測試啟動 MinIO用戶管理 Buckets管理 ?創(chuàng)建Buckets MinIO客戶端 引入依賴? ?文件上傳下載Demo 調(diào)用API碰到的問題 MinIO | 高性能, Kubernetes 原生對象存儲 MinIO是全球領(lǐng)先的對象存儲先鋒,目前在全世界有數(shù)百萬的用戶。 高性能 ,在標(biāo)準(zhǔn)硬件

    2024年02月07日
    瀏覽(30)
  • 詳解JS實現(xiàn)單個或多個文件批量下載的方法

    目錄 0.JS簡介 前言 單個文件Download 方案一:location.href or window.open 方案二:通過a標(biāo)簽的download屬性 方案三:API請求 多個文件批量Download 方案一:按單個文件download方式,循環(huán)依次下載 方案二:前端打包成zip download 方案三:后端壓縮成zip,然后以文件流url形式,前端調(diào)用dow

    2024年02月01日
    瀏覽(87)
  • docker save多個鏡像打包成一個tar.gz壓縮文件

    有時候我們需要將docker中的多個鏡像批量的傳輸?shù)搅硪慌_機(jī)器,如果通過docker save這種命令則需要制作多個tar文件,這樣以來冗余的操作較多而且tar文件占據(jù)的空間較大,不利于傳輸。 可以通過以下命令在兩個docker之間實現(xiàn)多個鏡像批量傳輸: 如果想將所有鏡像傳輸?shù)搅硪慌_

    2024年02月04日
    瀏覽(24)
  • 百度智能云對象存儲BOS批量下載文件方法

    百度智能云對象存儲BOS批量下載文件方法

    百度智能云對象存儲BOS支持批量打包下載嗎?目前對象存儲BOS瀏覽器端不支持批量下載,可以使用對象存儲BOS桌面或BOSCMD批量下載,也可以使用API/SDK調(diào)用接口循環(huán)下載。新手站長網(wǎng)來詳細(xì)說下百度云對象存儲BOS批量下載的方法: 目錄 百度云對象存儲BOS批量下載 BOS桌面客戶端

    2023年04月20日
    瀏覽(40)
  • Java調(diào)用Elasticsearch API實現(xiàn)全文檢索,搭配MinIO文件存儲

    Java調(diào)用Elasticsearch API實現(xiàn)全文檢索,搭配MinIO文件存儲

    應(yīng)用背景: 對存儲在MinIO服務(wù)器的文件實現(xiàn)全文檢索。也可以是其他服務(wù)器或本地文件,本文僅詳細(xì)介紹MinIO文件的讀取及轉(zhuǎn)換。通過Elasticsearch的Ingest-Attachment插件抽取文件內(nèi)容,支持Word、Excel、PDF、TXT等格式文件,無需手動解析文件內(nèi)容。 上代碼,詳細(xì)解釋可以閱讀注釋、

    2024年02月11日
    瀏覽(50)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包