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

Minio大文件分片上傳、斷點續(xù)傳實現(xiàn)

這篇具有很好參考價值的文章主要介紹了Minio大文件分片上傳、斷點續(xù)傳實現(xiàn)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

使用minio api實現(xiàn)分片上傳及斷點續(xù)傳功能。
前端準備:獲取大文件的MD5值,將文件分片,5M為一分片,排好順序,并按順序命名(1,2,3這種后面比較好合并)

Minio大文件分片上傳、斷點續(xù)傳實現(xiàn)

在上傳分片階段,前端有上傳進度條
Minio大文件分片上傳、斷點續(xù)傳實現(xiàn)
1、檢驗文件MD5值
1.1 redis中查看MD5是否存在

 		String data;
        try {
            data = customRedisCache.getCacheObject(md5);
        } catch (Exception e) {
            e.printStackTrace();
        } 

1.2 判斷臨時文件夾是否存在
boolean d = doesFolderExist(bucket, md5);

 /**
     * 判斷文件夾是否存在
     *
     * @param bucketName 存儲桶
     * @param objectName 文件夾名稱(去掉/)
     * @return true:存在
     */
    public boolean doesFolderExist(String bucketName, String objectName) {
        boolean exist = false;
        try {
            Iterable<Result<Item>> results = minioClient.listObjects(
                    ListObjectsArgs.builder().bucket(bucketName).prefix(objectName).recursive(false).build());
            StringBuilder objectNameBuilder = new StringBuilder(objectName);
            for (Result<Item> result : results) {
                objectNameBuilder.append("/");
                Item item = result.get();
                if (item.isDir() && objectNameBuilder.toString().equals(item.objectName())) {
                    exist = true;
                }
            }
        } catch (Exception e) {
            exist = false;
        }
        return exist;
    }

1.3 刪除臨時文件夾及其中文件
deleteObject(bucket, md5);

public void deleteObject(String bucketName, String objectName) {
        String objectNames = objectName + "/";
        try {
            if (StringUtils.isNotBlank(objectNames)) {
                if (objectNames.endsWith(".") || objectNames.endsWith("/")) {
                    Iterable<Result<Item>> list = minioClient.listObjects(ListObjectsArgs.builder().bucket(bucketName).prefix(objectNames).recursive(false).build());
                    list.forEach(e -> {
                        try {
                            minioClient.removeObject(RemoveObjectArgs.builder().bucket(bucketName).object(e.get().objectName()).build());
                        } catch (Exception a) {
                            return;
                        }

                    });
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

1.4 上傳文件和上傳分片一樣

 InputStream inputStream;
        try {
            inputStream = file.getInputStream();
            minioClient.putObject(PutObjectArgs.builder()
                    .bucket(packages)
                    .object(md5 + "/" + chunk)
                    .stream(inputStream, file.getSize(), -1)
                    .contentType("application/x-img")
                    .build());
        } catch (Exception e) {
            e.printStackTrace();
            return new ResultDto(ResultDto.ERROR, "上傳失敗", chunk);
        }
        return new ResultDto(ResultDto.SUCCESS, "上傳成功", chunk);

.object(md5 + “/” + chunk) :這種方式在minio里會先創(chuàng)建文件夾

1.5 合并分片
boolean b = merge(bucket, md5, fileName);

 /**
     * 將塊文件合并到新桶   塊文件必須滿足 名字是 0 1  2 3 5....
     *
     * @param bucketName 存塊文件的桶
     * @param objectName 存新文件的桶
     * @param fileName1  存到新桶中的文件名稱
     * @return
     */
    public boolean merge(String bucketName, String objectName, String fileName1) {
        try {
            List<ComposeSource> sourceObjectList = new ArrayList<ComposeSource>();
            List<Object> folderList = this.getFolderList(bucketName, objectName);
            List<String> fileNames = new ArrayList<>();
            if (folderList != null && !folderList.isEmpty()) {
                for (Object value : folderList) {
                    Map o = (Map) value;
                    String name = (String) o.get("fileName");
                    fileNames.add(name);
                }
            }
            List<Integer> fileNameInt = new ArrayList<>();
            List<String> fileNameLast = new ArrayList<>();
            if (!fileNames.isEmpty()) {
                for (String fileName : fileNames) {
                    fileNameInt.add(Integer.parseInt(fileName.split("/")[1]));
                }
                Collections.sort(fileNameInt);
                for (int j = 0; j < fileNameInt.size(); j++) {
                    fileNameLast.add(fileNames.get(j).split("/")[0] + "/" + fileNameInt.get(j));
                }
                for (String name : fileNameLast) {
                    sourceObjectList.add(ComposeSource.builder().bucket(bucketName).object(name).build());
                }
            }

            minioClient.composeObject(
                    ComposeObjectArgs.builder()
                            .bucket(bucketName)
                            .object(fileName1)
                            .sources(sourceObjectList)
                            .build());
            return true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }
 //獲取指定bucketName下所有文件 文件名+大小
    public List<Object> getFolderList(String bucketName, String objectName) throws Exception {
        String objectNames = objectName + "/";
        Iterable<Result<Item>> results = minioClient.listObjects(ListObjectsArgs.builder().bucket(bucketName).prefix(objectNames).recursive(false).build());
        Iterator<Result<Item>> iterator = results.iterator();
        List<Object> items = new ArrayList<>();
        String format = "{'fileName':'%s','fileSize':'%s'}";
        while (iterator.hasNext()) {
            Item item = iterator.next().get();
            items.add(JSON.parse((String.format(format, item.objectName(),
                    formatFileSize(item.size())))));
        }
        return items;
    }
private static String formatFileSize(long fileS) {
        DecimalFormat df = new DecimalFormat("#.00");
        String fileSizeString;
        String wrongSize = "0B";
        if (fileS == 0) {
            return wrongSize;
        }
        if (fileS < 1024) {
            fileSizeString = df.format((double) fileS) + " B";
        } else if (fileS < 1048576) {
            fileSizeString = df.format((double) fileS / 1024) + " KB";
        } else if (fileS < 1073741824) {
            fileSizeString = df.format((double) fileS / 1048576) + " MB";
        } else {
            fileSizeString = df.format((double) fileS / 1073741824) + " GB";
        }
        return fileSizeString;
    }

1.6 檢驗MD5值
boolean checkMd5 = checkMd5(bucket, fileName, md5);文章來源地址http://www.zghlxwxcb.cn/news/detail-489608.html

    private boolean checkMd5(String bucketName, String fileName, String md5) {
        try {
            //利用apache工具類獲取文件md5值
            InputStream inputStream = getInput(bucketName, fileName);
            String md5Hex = DigestUtils.md5Hex(inputStream);
            if (md5.equalsIgnoreCase(md5Hex)) {
                return true;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

到了這里,關于Minio大文件分片上傳、斷點續(xù)傳實現(xiàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

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

領支付寶紅包贊助服務器費用

相關文章

  • 前端文件上傳(文件上傳,分片上傳,斷點續(xù)傳)

    前端文件上傳(文件上傳,分片上傳,斷點續(xù)傳)

    普通文件上傳 思路: 首先獲取用戶選擇的文件對象,并將其添加到一個 FormData 對象中。然后,使用 axios 的 post 方法將 FormData 對象發(fā)送到服務器。在 then 和 catch 中,我們分別處理上傳成功和失敗的情況,并輸出相應的信息。 需要注意,在使用 axios 進行文件上傳時,必須將

    2024年02月22日
    瀏覽(30)
  • 上傳視頻文件,基于斷點續(xù)傳(整合Minio)

    上傳視頻文件,基于斷點續(xù)傳(整合Minio)

    目錄 1、什么是斷點續(xù)傳 2、分塊文件 3、合并文件 4、?Minio 分布式文件系統(tǒng)整合斷點續(xù)傳 4.1 進行文件分塊上傳到 Minio? 4.2 進行 Minio 中分塊文件的合并 5、使用 Minio 進行斷點續(xù)傳的注意事項 ? ????????相信很多小伙伴在上傳下載圖片或者視頻的時候,突然間(沒錯就是這

    2024年02月11日
    瀏覽(28)
  • 【萬字長文】Vue+SpringBoot實現(xiàn)大文件秒傳、斷點續(xù)傳和分片上傳完整教程(提供Gitee源碼)

    前言:最近在實際項目中碰到一個需求,客戶可能會上傳比較大的文件,如果采用傳統(tǒng)的文件上傳方案可能會存在服務器壓力大、資源浪費甚至內(nèi)存溢出的一些安全風險,所以為了解決一系列問題,需要采用新的技術方案來實現(xiàn)大文件的上傳;空閑的時候參考了網(wǎng)上的一些相

    2024年02月12日
    瀏覽(24)
  • spring boot 阿里云oss 文件分片上傳、斷點續(xù)傳

    spring boot 阿里云oss 文件分片上傳、斷點續(xù)傳

    文章目錄 前言 一、申請阿里云oss 二、上代碼 總結 ? ? ? 阿里云對象存儲OSS(Object Storage Service)是一款海量、安全、低成本、高可靠的云存儲服務,可提供99.9999999999%(12個9)的數(shù)據(jù)持久性,99.995%的數(shù)據(jù)可用性。多種存儲類型供選擇,全面優(yōu)化存儲成本。 ? ? 您可以使用阿

    2024年02月07日
    瀏覽(26)
  • 前端 + 后端 實現(xiàn)分片上傳(斷點續(xù)傳/極速秒傳)

    先記錄下,后面有時間再去實現(xiàn) (已實現(xiàn),可參考 SpringBoot+vue文件上傳下載預覽大文件分片上傳文件上傳進度 SpringBoot+vue 大文件分片下載) 可參考鏈接:vue上傳大文件/視頻前后端(java)代碼 前端slice分片上傳,后端用表記錄分片索引和分片大小和分片總數(shù),當接受完最后

    2023年04月17日
    瀏覽(24)
  • 大文件上傳阿里云oss,分片、斷點續(xù)傳進度條展示

    大文件上傳阿里云oss,分片、斷點續(xù)傳進度條展示

    前端頁面展示 大文件如果不采用分片上傳會導致卡死、內(nèi)存占用過高導致程序奔潰等一些列問題。 通常在文件大于100 MB的情況下,建議采用分片上傳的方法,通過斷點續(xù)傳和重試,提高上傳成功率。如果在文件小于100 MB的情況下使用分片上傳,且partSize設置不合理的情況下,

    2024年02月11日
    瀏覽(26)
  • SpringBoot + minio實現(xiàn)分片上傳、秒傳、續(xù)傳

    SpringBoot + minio實現(xiàn)分片上傳、秒傳、續(xù)傳

    MinIO是一個基于Go實現(xiàn)的高性能、兼容S3協(xié)議的對象存儲。它采用GNU AGPL v3開源協(xié)議,項目地址是https://github.com/minio/minio。 引用官網(wǎng): MinIO是根據(jù)GNU Affero通用公共許可證v3.0發(fā)布的高性能對象存儲。它與Amazon S3云存儲服務兼容。使用MinIO構建用于機器學習,分析和應用程序數(shù)據(jù)工

    2024年02月08日
    瀏覽(23)
  • springboot整合vue2-uploader文件分片上傳、秒傳、斷點續(xù)傳

    springboot整合vue2-uploader文件分片上傳、秒傳、斷點續(xù)傳

    vue-simple-uploader 是基于 simple-uploader.js 封裝的vue上傳插件。它的優(yōu)點包括且不限于以下幾種: 支持文件、多文件、文件夾上傳;支持拖拽文件、文件夾上傳 可暫停、繼續(xù)上傳 錯誤處理 支持“秒傳”,通過文件判斷服務端是否已存在從而實現(xiàn)“秒傳” 分片上傳 支持進度、預估

    2024年02月06日
    瀏覽(35)
  • 基于vue-simple-uploader封裝文件分片上傳、秒傳及斷點續(xù)傳的全局上傳

    基于vue-simple-uploader封裝文件分片上傳、秒傳及斷點續(xù)傳的全局上傳

    1. 前言 文件上傳 小文件(圖片、文檔、視頻)上傳可以直接使用很多ui框架封裝的上傳組件,或者自己寫一個input 上傳,利用FormData 對象提交文件數(shù)據(jù),后端使用spring提供的MultipartFile進行文件的接收,然后寫入即可。但是對于比較大的文件,比如上傳2G左右的文件(http上傳

    2024年02月06日
    瀏覽(22)
  • springboot 、html分片上傳,斷點續(xù)傳

    后端代碼 注意:合并分片代碼中: Files.write(mergedFilePath, Files.readAllBytes(chunkFilePath), StandardOpenOption.APPEND); 如果不設置該值 StandardOpenOption.APPEND ,無法打開合并后的文件 前端代碼

    2024年02月05日
    瀏覽(20)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領取紅包

二維碼2

領紅包