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

Java壓縮與解壓縮ZIP文件

這篇具有很好參考價值的文章主要介紹了Java壓縮與解壓縮ZIP文件。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

前言

在現(xiàn)代計算機上,數(shù)據(jù)傳輸和存儲越來越依賴于文件壓縮技術(shù)。當(dāng)我們需要發(fā)送大量數(shù)據(jù)時,壓縮文件可以大大減少傳輸時間和網(wǎng)絡(luò)帶寬,而且壓縮文件還可以幫助我們節(jié)省磁盤空間。在Java中提供了壓縮和解壓縮文件的功能,可以使用java.util.zip包中的類來實現(xiàn)。本篇將對如何使用 Java 實現(xiàn)單文多件壓縮和解壓縮進行總結(jié)。

文件壓縮指的是將一個或多個文件通過壓縮算法,將其存儲為一個更小的文件,以便于存儲和傳輸。壓縮的原理是通過對文件的數(shù)據(jù)進行編碼和壓縮,使其占用更少的空間。壓縮后的文件可以通過解壓縮算法還原成原始的文件格式。在文件壓縮過程中,常見的操作是將多個文件打包成一個壓縮文件,例如zip、tar等格式。

Java解壓縮文件

常見的文件壓縮格式包括:

  • ZIP:最常見的壓縮文件格式之一,可以存儲一個或多個文件,并可在不同的操作系統(tǒng)中進行解壓縮。
  • TAR:Linux系統(tǒng)中的常見文件壓縮格式,通常用于打包多個文件,但不會進行壓縮。
  • GZIP:常用的文件壓縮格式,通常用于壓縮單個文件,可以獲得更高的壓縮比。
  • BZIP2:高效的壓縮算法,通常用于壓縮文本文件和XML文件等。
  • JAR: Jar包對于Java開發(fā)同學(xué)來說肯定很熟悉,其也是一個壓縮包

Java提供了多種用于壓縮和解壓縮文件的API,主要包括以下類和方法:

  • ZipOutputStream 和 ZipInputStream:用于創(chuàng)建和讀取ZIP格式的壓縮文件。
  • GZIPOutputStream 和 GZIPInputStream:用于創(chuàng)建和讀取GZIP格式的壓縮文件。
  • JarOutputStream 和 JarInputStream:用于創(chuàng)建和讀取JAR格式的壓縮文件。
  • DeflaterOutputStream 和 InflaterInputStream:用于創(chuàng)建和讀取DEFLATE格式的壓縮文件。
  • CheckedOutputStream 和 CheckedInputStream:用于在壓縮和解壓縮過程中計算文件的校驗和。

壓縮和解壓縮ZIP文件

通過使用Java 自帶的 java.util.zip 類庫下的ZipOutputStreamZipInputStream、ZipEntry實現(xiàn)文件的壓縮和解壓縮,其中ZipOutputStream用于創(chuàng)建ZIP壓縮文件輸出流輸出ZIP壓縮文件,ZipInputStream用于創(chuàng)建ZIP文件輸入流讀取ZIP文件用于解壓縮而ZipEntry對應(yīng)ZIP壓縮包中的每個被壓縮對象;

  • 生成ZIP文件

    壓縮單個文件或者單個文件夾方法,代碼如下:

    /**
     * 壓縮文件(支持單個文件和單個文件夾)
     * @param sourceFile 被壓縮文件/文件夾
     * @param zipFile Zip文件
     */
    public static void zipCompress(File sourceFile, File zipFile) {
        try (ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipFile))) {
            // 設(shè)置壓縮方法
            zos.setMethod(ZipOutputStream.DEFLATED);
            zos.setLevel(Deflater.BEST_COMPRESSION); // 默認(rèn)為-1,壓縮級別,1速度快,效率低,9 速度滿,效率高
            // zos.setLevel(Deflater.BEST_SPEED);
            zos.setComment("zip文件說明");
            // 處理文件夾
            if (sourceFile.exists() && sourceFile.isDirectory() && Objects.nonNull(sourceFile.listFiles())){
                Arrays.stream(Objects.requireNonNull(sourceFile.listFiles())).forEach(file -> {
                    addZipFile(file, zos);
                });
            }else{
                addZipFile(sourceFile, zos);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    

    為了支持讀取單個文件夾進行壓縮,增加一個向ZipOutputStream中添加ZipEntry的方法,代碼如下:

    /**
     * 向ZIP中添加文件
     * @param file 源文件
     * @param zos zip輸出流
     */
    private static void addZipFile(File file, ZipOutputStream zos){
        if (!file.exists() || file.isDirectory()){
            throw new RuntimeException("文件不存在或該文件為文件夾,請檢查");
        }
        try {
            // 讀入文件
            FileInputStream fis = new FileInputStream(file);
            // 創(chuàng)建壓縮對象并設(shè)置一些屬性
            ZipEntry entry = new ZipEntry(file.getName());
            entry.setMethod(ZipEntry.DEFLATED); // 壓縮方法默認(rèn)為DEFLATED
            // entry.setMethod(ZipEntry.STORED); // STORED(不壓縮)。當(dāng)使用STORED壓縮方法時,需要設(shè)置未壓縮的數(shù)據(jù)大小和CRC-32校驗和,否則壓縮和解壓縮時會出現(xiàn)錯誤。
            entry.setSize(file.length()); // 設(shè)置未壓縮的數(shù)據(jù)大小,這里設(shè)置的是文件大小
            // 計算 CRC-32 校驗碼
            // byte[] data = Files.readAllBytes(file.toPath());
            // CRC32 crc = new CRC32();
            // crc.update(data);
            // entry.setCrc(crc.getValue()); // 設(shè)置CRC-32校驗和,用于保證壓縮后的數(shù)據(jù)完整性,盡量別手動設(shè)置,可以通過CRC-32計算
            entry.setCompressedSize(file.length()); // 設(shè)置壓縮后的數(shù)據(jù)大小,這里設(shè)置的是使用DEFLATED方法壓縮后的數(shù)據(jù)大小
            entry.setExtra(new byte[]{}); // 設(shè)置額外的數(shù)據(jù),這里設(shè)置為空
            entry.setComment("file comment"); // 設(shè)置ZipEntry的注釋,即文件說明
            entry.setCreationTime(FileTime.from(Instant.now())); // 設(shè)置文件的創(chuàng)建時間
            entry.setLastAccessTime(FileTime.from(Instant.now())); // 設(shè)置文件的最后訪問時間
            entry.setLastModifiedTime(FileTime.from(Instant.now())); // 設(shè)置文件的最后修改時間。
            // 向ZIP輸出流中添加一個ZIP實體,構(gòu)造方法中的name參數(shù)指定文件在ZIP包中的文件名
            zos.putNextEntry(entry);
            // 向ZIP實體中寫入內(nèi)容
            byte[] buf = new byte[1024];
            int len;
            while ((len = fis.read(buf)) > 0) {
                zos.write(buf, 0, len);
            }
            // 關(guān)閉ZipEntry
            zos.closeEntry();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    

    注意:

    涉及到文件IO流,如果沒有使用try with source 的語法,一定要記得關(guān)閉輸入輸出流;

    使用Java.util.zip下的工具類壓縮成ZIP不支持設(shè)置ZIP密碼且每種模式下生成的ZIP文件大小大于等于原文件/文件夾;

    當(dāng)使用STORED壓縮方法時,需要設(shè)置未壓縮的數(shù)據(jù)大小和CRC-32校驗和,該值需要借助CRC-32計算非常的麻煩,不設(shè)置此值會拋出異常;

    對于壓縮,可以使用 ZipOutputStream 的 putNextEntry 方法逐個添加文件,避免將所有文件一次性讀入內(nèi)存;

    可以設(shè)置緩沖區(qū)大小,例如對于文件的讀取和寫入,可以設(shè)置緩沖區(qū)大小為 4KB 或者 8KB,減少內(nèi)存的占用;

    對于解壓縮,可以使用 ZipInputStream 的 getNextEntry 方法逐個讀取文件,避免將所有文件一次性讀入內(nèi)存;

  • 解壓縮ZIP文件

    將ZIP文件解壓縮支持生成文件夾,代碼如下:

    /**
     * 解壓縮ZIP文件
     * @param zipFile ZIP文件
     * @param destDir 目標(biāo)路徑
     */
    public static void zipDecompress(File zipFile, File destDir) {
        byte[] buffer = new byte[1024];
        try (ZipInputStream zis = new ZipInputStream(new FileInputStream(zipFile))) {
            ZipEntry entry = zis.getNextEntry();
            while (entry != null) {
                File file = new File(destDir, entry.getName());
                if (entry.isDirectory()) {
                    file.mkdirs();
                } else {
                    File parent = file.getParentFile();
                    if (!parent.exists()) {
                        parent.mkdirs();
                    }
                    try (FileOutputStream fos = new FileOutputStream(file)) {
                        int len;
                        while ((len = zis.read(buffer)) > 0) {
                            fos.write(buffer, 0, len);
                        }
                    }
                }
                entry = zis.getNextEntry();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
  • 如何避免壓縮文件中的注入攻擊?

    壓縮文件中的路徑名和文件名可以被精心構(gòu)造的攻擊者利用,從而使得解壓縮的過程中可能會導(dǎo)致路徑遍歷、文件覆蓋等問題,進而導(dǎo)致安全問題。為了避免這些安全問題,可以進行如下處理:

    • 限制壓縮文件中的路徑名和文件名的長度,以及字符集,可以采用白名單機制對輸入進行限制;
    • 對于解壓縮的路徑名和文件名,不要使用壓縮文件中的路徑名和文件名,而是在解壓縮時自行構(gòu)造一個路徑名和文件名;
    • 對于不可信任的壓縮文件,最好在安全的環(huán)境下解壓縮,例如在沙箱或虛擬機中進行操作。

檢驗

主要測試使用上述代碼壓縮單文件和解壓縮單文件能否成功以后測量單個文件的處理耗時,同時測試單文件夾多文件壓縮和解壓縮能否成功以及處理耗時,單元測試代碼如下:

@Test
void testJavaUtilZip(){
    // 測試壓縮和解壓縮單文件ZIP
    // 被壓縮的MP4單文件,大小112.5MB
    File inputFile = new File("/Users/zlc/Documents/own/images/GPT-4 Developer Livestream.mp4");
    // ZIP文件路徑
    File zipFile = new File("/Users/zlc/Documents/own/mp4.zip");
    // ZIP 解壓縮路徑
    File unzipFile = new File("/Users/zlc/Documents/own/unzip");
    long start = System.currentTimeMillis();
    // 壓縮文件
    ZipFileUtil.zipCompress(inputFile, zipFile);
    long end = System.currentTimeMillis();
    System.out.println("ZIP-壓縮單文件耗時:" + (end - start) + "毫秒");
    start = System.currentTimeMillis();
    ZipFileUtil.zipDecompress(zipFile, unzipFile);
    end = System.currentTimeMillis();
    System.out.println("ZIP-解壓縮單文件耗時:" + (end - start) + "毫秒");
    // 單文件夾多文件壓縮和解壓縮測試
    // 文件夾大小2.42G
    File inputFiles = new File("/Users/zlc/Documents/own/images");
    File zipFiles = new File("/Users/zlc/Documents/own/imagesZip.zip");
    File unzipFiles = new File("/Users/zlc/Documents/own/imagesUnzip");
    start = System.currentTimeMillis();
    // 壓縮文件
    ZipFileUtil.zipCompress(inputFiles, zipFiles);
    end = System.currentTimeMillis();
    System.out.println("ZIP - 多文件壓縮耗時:" + (end - start) + "毫秒");
    start = System.currentTimeMillis();
    ZipFileUtil.zipDecompress(zipFiles, unzipFiles);
    end = System.currentTimeMillis();
    System.out.println("ZIP - 多文件解壓縮耗時:" + (end - start) + "毫秒");
}

測試結(jié)果如下:

ZIP-壓縮單文件耗時:5492毫秒
ZIP-解壓縮單文件耗時:1920毫秒
ZIP - 多文件壓縮耗時:136059毫秒
ZIP - 多文件解壓縮耗時:45739毫秒

同時測試了設(shè)置不同壓縮等級的耗時比較,結(jié)果如下:

// 不同壓縮等級下的處理耗時 
BEST_COMPRESSION 2.43G 文件夾耗時119801毫秒快兩分鐘了
BEST_SPEED 2.43G 文件夾耗時112646毫秒 也沒差多少,但確實快了

結(jié)論:

測試環(huán)境為MacOS 四核Intel Core i7,16G內(nèi)存,處理將近2.5G大小的文件夾耗時接近兩分鐘,效率十分低下,在總文件大小不大的時候可以考慮使用JDK自帶的壓縮工具類。

應(yīng)用

設(shè)計一個API,通過使用Hutool生成兩個CSV文件和一個Excel文件,將這三個文件放入到ZIP壓縮包中,當(dāng)通過瀏覽器調(diào)用API時,下載ZIP壓縮包。

同時在服務(wù)器上不生成CVS、EXCEL以及Zip文件而是直接通過HttpServletResponse將文件傳送給客戶端,避免服務(wù)器因過多生成這些文件導(dǎo)致服務(wù)硬盤不夠用(PS:生成文件以后基本上不會有人管了,會隨著時間的增加爆炸式增加,當(dāng)然如果你需要留存建議生成本地文件存儲到OSS中),代碼如下:

  /**
 * 下載ZIP
 * @param response HttpServletResponse 響應(yīng)流
 * @return zip file 
 */
@GetMapping(value = "/downloadZip")
public String downloadZipFile(HttpServletResponse response) {

    // 設(shè)置響應(yīng)頭
    response.setContentType("application/octet-stream");
    response.setHeader("Content-Disposition", "attachment; filename=download.zip");

    try (ZipOutputStream outputStream = new ZipOutputStream(response.getOutputStream())) {

        ExcelWriter writer = new ExcelWriter(true);
        List<String> header = Arrays.asList("開始日期", "結(jié)束日期", "算法廠商", "期末資產(chǎn)總額", "累計成交金額",
                "期間委托筆數(shù)", "期間成交筆數(shù)", "期間撤單筆數(shù)");
        writer.writeHeadRow(header);

        List<List<String>> rows = new ArrayList<>();
        rows.add(Arrays.asList("張三", "里斯", "男", "張三", "里斯", "男", "張三", "里斯"));
        rows.add(Arrays.asList("李四", "王武", "女", "張三", "里斯", "男", "張三", "里斯"));
        writer.write(rows);

        writer.passRows(1);

        List<String> header1 = Arrays.asList("日期", "資金賬號", "算法母單編號", "委托編號", "交易所", "股票代碼",
                "委托數(shù)量", "交易方向", "訂單類型", "委托價格", "委托狀態(tài)", "累計成交數(shù)量", "累計成交金額");
        writer.writeHeadRow(header1);
        writer.autoSizeColumn(writer.getCurrentRow());
        List<List<String>> rows2 = new ArrayList<>();
        rows2.add(Arrays.asList("張三", "里斯", "男", "張三", "里斯", "男", "張三", "里斯", "找大大", "趙打打", "炸", "茅臺", "米線"));
        rows2.add(Arrays.asList("李四", "王武", "女", "張三", "里斯", "男", "張三", "里斯", "找大大", "趙打打", "炸", "茅臺", "米線"));
        writer.write(rows2);
        writer.autoSizeColumnAll();

        ZipEntry entry = new ZipEntry("數(shù)據(jù).xlsx");
        outputStream.putNextEntry(entry);
        writer.flush(outputStream);
        writer.close();
        outputStream.closeEntry();

        ZipEntry entry1 = new ZipEntry("母單.csv");
        outputStream.putNextEntry(entry1);
        CsvWriter csvWriter1 = new CsvWriter(new OutputStreamWriter(outputStream));
        String[] csvHead1 = {"日期", "資金賬號", "算法廠商", "算法", "算法母單編號", "交易所", "股票代碼", "委托數(shù)量", "交易方向", "啟動時間", "停止時間", "算法狀態(tài)"};
        csvWriter1.writeLine(csvHead1);
        String[] csvData1 = {"20230203", "98830901", "XX", "TWAP", "12984", "SH", "600000", "10000", "4", "102311", "112311", "1"};
        String[] csvData2 = {"20230203", "98830901", "XX", "TWAP", "12984", "SH", "600000", "10000", "4", "102311", "112311", "1"};
        csvWriter1.writeLine(csvData1);
        csvWriter1.writeLine(csvData2);

        csvWriter1.flush();
        outputStream.closeEntry();

        ZipEntry entry2 = new ZipEntry("子單.csv");
        outputStream.putNextEntry(entry2);
        CsvWriter csvWriter2 = new CsvWriter(new OutputStreamWriter(outputStream));
        String[] csvHead2 = {"日期", "資金賬號", "算法母單編號", "委托編號", "交易所", "股票代碼", "委托數(shù)量", "交易方向", "訂單類型", "委托價格", "委托狀態(tài)", "累計成交數(shù)量", "累計成交金額"};
        csvWriter2.writeLine(csvHead2);
        String[] csvData3 = {"20230203", "98830901", "12984", "ord1122", "SH", "600000", "1000", "4", "1", "7.23", "1", "800", "5600"};
        String[] csvData4 = {"20230203", "98830901", "12984", "ord1122", "SH", "600000", "1000", "4", "1", "7.23", "1", "800", "5600"};
        csvWriter2.writeLine(csvData3);
        csvWriter2.writeLine(csvData4);
        csvWriter2.flush();
        outputStream.closeEntry();
        outputStream.finish();
        return "success";
    } catch (Exception e) {
        return "faild";
    }
}

總結(jié)

Java 自帶的 java.util.zip 類庫是一個基礎(chǔ)的壓縮和解壓縮類庫,它提供了很基本的壓縮和解壓縮功能。在處理小型文件或數(shù)據(jù)時,java.util.zip 是一個可行的選擇。不過,對于大型文件或數(shù)據(jù)的處理,效率可能會受到影響。相比之下,一些第三方的類庫如 Apache Commons Compress、Zip4j 等提供了更為高級的壓縮和解壓縮功能,同時也提供了更好的性能。
本文首發(fā)于香菜喵,打開微信隨時隨地讀,文章下方 ↓ ↓ ↓文章來源地址http://www.zghlxwxcb.cn/news/detail-487596.html

到了這里,關(guān)于Java壓縮與解壓縮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īng)查實,立即刪除!

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

相關(guān)文章

  • java 文件壓縮zip【兩種方式】

    ?一、普通方式 二、使用zip4j方式 引入jar: ?代碼塊:

    2024年02月11日
    瀏覽(19)
  • Java 壓縮多個文件為zip包(中間不生成臨時文件,直接壓縮為zip二進制流),以及解壓zip包二進制流為文件

    Java 壓縮多個文件為zip包(中間不生成臨時文件,直接壓縮為zip二進制流),以及解壓zip包二進制流為文件

    這篇博客將提供倆種方法, 提前生成要壓縮的多個文件,然后讀取文件夾多層或一層去遍歷壓縮zip包 直接用原始文件名稱及二進制流,壓縮返回zip包二進制流,中間不生成冗余文件; 很明顯方法2更優(yōu)一些; 解壓zip文件或者zip文件流驗證; 壓縮倆個文件到zip包,并分別解析

    2024年02月06日
    瀏覽(22)
  • java~將多個輸出流壓縮成一個zip文件

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

    2024年02月05日
    瀏覽(25)
  • Java的zip文件壓縮與解壓:ZipInputStream,ZipOutputStream

    Java的zip文件壓縮與解壓:ZipInputStream,ZipOutputStream

    ?? 用ZipOutputStream來壓縮一個文件夾時,要搭配ZipEntry來使用。ZipEntry是用來創(chuàng)建壓縮文件的。 ?? 舉個例子,向壓縮文件中添加一個文件的代碼: 如下圖: ?? 在創(chuàng)建ZipEntry對象時可以指定文件在壓縮包的位置:new ZipEntry(“second-dirsecond-01.txt”) ?? 在使用ZipOutputStrea

    2024年02月16日
    瀏覽(30)
  • linuxOps基礎(chǔ)_linux文件打包壓縮與解壓縮

    linuxOps基礎(chǔ)_linux文件打包壓縮與解壓縮

    默認(rèn)情況下,Linux的壓縮概念一次只能壓縮一個文件。針對多文件或文件夾無法進行直接壓縮。所以需要提前對多個文件或文件夾進行打包,這樣才可以進行壓縮操作。 打包 打包只是把多個文件或文件夾打包放在一個文件中,但是并沒有進行壓縮,所以其大小還是原來所有文

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

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

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

    2024年02月06日
    瀏覽(31)
  • java 解讀zip文件,獲取壓縮包內(nèi)各文件的流的集合

    解讀zip文件,把zip文件內(nèi)的眾文件轉(zhuǎn)化成流集合,方便其他后續(xù)操作

    2024年02月10日
    瀏覽(21)
  • java 批量下載將多個文件(minio中存儲)壓縮成一個zip包

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

    我的需求是將minio中存儲的文件按照查詢條件查詢出來統(tǒng)一壓成一個zip包然后下載下來。 思路:針對這個需求,其實可以有多個思路,不過也大同小異,一般都是后端返回流文件前端再處理下載,也有少數(shù)是壓縮成zip包之后直接給下載鏈接返回到前端,前端收到鏈接url直接

    2024年02月10日
    瀏覽(63)
  • Java利用Apache compress包實現(xiàn)文件夾壓縮成Zip包

    Apache common提供了很多實用的工具包,下面就說一下如何用compress包來壓縮文件夾。先引入compress,io和lang3這3個工具包: 這個方法實現(xiàn)了將文件夾下所有的文件壓縮成zip包,并輸出到文件流中,可以直接寫入到文件或提供給前端下載,工具類如下: 執(zhí)行main函數(shù)跑測試用例,發(fā)

    2024年01月20日
    瀏覽(23)
  • Linux bzip2命令教程:文件壓縮與解壓縮實戰(zhàn)(附案例詳解和注意事項)

    bzip2 是一個基于命令行的文件壓縮器,它使用Burrows-Wheeler塊排序文本壓縮算法和哈夫曼編碼來進行壓縮。它的主要功能是壓縮和解壓縮文件,將多個文件綁定成一個單一的文件,這樣可以減少原始文件所占用的存儲空間。 bzip2 命令在大多數(shù)Linux發(fā)行版中都可以使用,包括Deb

    2024年04月15日
    瀏覽(22)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包