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

springboot 、html分片上傳,斷點(diǎn)續(xù)傳

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

springboot 、html分片上傳,斷點(diǎn)續(xù)傳

  1. 后端代碼
	private String UPLOAD_URL = "F:/20230509/";
    private String UPLOAD_SUFFIX_URL = "/gsl/www/";
    public  String getUPLOAD_URL() {
        return UPLOAD_URL + UPLOAD_SUFFIX_URL;
    }

    @PostMapping("/o_upload")
    public Result upload1(@RequestParam("file") MultipartFile multipartFile,
                          @RequestParam("fileName") String fileName,
                          @RequestParam("chunkNumber") int chunkNumber,
                          @RequestParam("totalChunks") int totalChunks) throws IOException {
        UserDetail user = SecurityUser.getUser();
        String originalFileName = StringUtils.cleanPath(multipartFile.getOriginalFilename());
        String fileExtension = getFileExtension(originalFileName);
        String uniqueFileName = fileName + "_" + chunkNumber + "." + fileExtension;
        Path uploadPath = Paths.get(this.getUPLOAD_URL());
        if (!Files.exists(uploadPath)) {
            Files.createDirectories(uploadPath);
        }
        Path filePath = Paths.get(this.getUPLOAD_URL() + uniqueFileName);
        Files.write(filePath, multipartFile.getBytes());
        if (chunkNumber == totalChunks - 1) {
            return mergeChunks(fileName, totalChunks, fileExtension, user.getId());
        } else {
            return new Result().error("上傳失敗");
        }
    }
    private String getFileExtension(String fileName) {
        int dotIndex = fileName.lastIndexOf(".");
        if (dotIndex > 0) {
            return fileName.substring(dotIndex + 1);
        } else {
            return "";
        }
    }

    /**
     * 合并分片
     * @param fileName
     * @param totalChunks
     * @param fileExtension
     * @param userId
     * @return
     * @throws IOException
     */
    private Result mergeChunks(String fileName, int totalChunks, String fileExtension, Long userId) throws IOException {
        Path mergedFilePath = Paths.get(this.getUPLOAD_URL() + fileName + "." + fileExtension);
        if (!Files.exists(mergedFilePath)) {
            Files.createFile(mergedFilePath);
        }
        for (int i = 0; i < totalChunks; i++) {
            Path chunkFilePath = Paths.get(this.getUPLOAD_URL() + fileName + "_" + i + "." + fileExtension);
            Files.write(mergedFilePath, Files.readAllBytes(chunkFilePath), StandardOpenOption.APPEND);
            Files.delete(chunkFilePath);
        }
        Path filePath = Paths.get(this.getUPLOAD_URL() + fileName);
        File file = new File(filePath.toString());
        // 原文件名稱
        String extension = file.getName().substring(0, file.getName().lastIndexOf("."));
        // 后綴
        String suffix = "." + file.getName().substring(file.getName().lastIndexOf(".") + 1);
        // 新的文件名稱
        String newFileName = System.currentTimeMillis() + suffix;
        // 文件重命名
        File renamedFile = new File(file.getParent(), newFileName);
        file.renameTo(renamedFile);
        // 文件路徑:/gsl/cms/1683616117391.zip
        String resourceUrl = UPLOAD_SUFFIX_URL + newFileName;
        // 可保存到數(shù)據(jù)庫
        Map<String, Object> map = new HashMap<>();
        map.put("url", resourceUrl);
        return new Result().ok(map);
    }

注意:合并分片代碼中:
Files.write(mergedFilePath, Files.readAllBytes(chunkFilePath), StandardOpenOption.APPEND);文章來源地址http://www.zghlxwxcb.cn/news/detail-445821.html

如果不設(shè)置該值StandardOpenOption.APPEND,無法打開合并后的文件
  1. 前端代碼
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>File Upload Test</title>
</head>
<body>
    <input type="file" id="fileInput">
    <button onclick="uploadFile()">Upload</button>

    <script>
        function uploadFile() {
            const file = document.getElementById("fileInput").files[0];
            const url = "/upload/o_upload";
            const chunkSize = 1024 * 1024; // 每個(gè)塊的大?。ㄗ止?jié))
            const fileSize = file.size; // 文件的總大小
            const totalChunks = Math.ceil(fileSize / chunkSize); // 文件被分成的總塊數(shù)

            let chunkNumber = 0; // 當(dāng)前上傳的塊的編號(hào)
            let startByte = 0; // 當(dāng)前上傳塊的起始字節(jié)位置
            let endByte = chunkSize; // 當(dāng)前上傳塊的結(jié)束字節(jié)位置(不包括)

            uploadChunk();

            function uploadChunk() {
                const chunk = file.slice(startByte, endByte); // 獲取當(dāng)前上傳塊的內(nèi)容
                const formData = new FormData(); // 創(chuàng)建FormData對(duì)象

                // 將參數(shù)添加到FormData對(duì)象中
                formData.append("file", chunk);
                formData.append("chunkNumber", chunkNumber);
                formData.append("totalChunks", totalChunks);
                formData.append("fileName", file.name);
                formData.append("fileSize", fileSize);

                // 創(chuàng)建XMLHttpRequest對(duì)象
                const xhr = new XMLHttpRequest();
                xhr.open("POST", url, true);

                // 監(jiān)聽XMLHttpRequest對(duì)象的事件
                xhr.onload = function() {
                    if (xhr.status === 200) {
                        // 上傳成功,繼續(xù)上傳下一塊
                        chunkNumber++;
                        startByte = endByte;
                        endByte = Math.min(startByte + chunkSize, fileSize);
                        if (startByte < fileSize) {
                            uploadChunk();
                        } else {
                            // 所有塊上傳成功
                            console.log("Upload completed");
                        }
                    } else {
                        // 上傳失敗,嘗試重傳當(dāng)前塊
                        console.error(xhr.statusText);
                        setTimeout(uploadChunk, 1000);
                    }
                };

                xhr.onerror = function() {
                    // 網(wǎng)絡(luò)錯(cuò)誤,嘗試重傳當(dāng)前塊
                    console.error(xhr.statusText);
                    setTimeout(uploadChunk, 1000);
                };

                // 發(fā)送POST請(qǐng)求
                xhr.send(formData);
            }
        }
    </script>
</body>
</html>

到了這里,關(guān)于springboot 、html分片上傳,斷點(diǎn)續(xù)傳的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

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

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

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

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

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

    2023年04月17日
    瀏覽(24)
  • Minio大文件分片上傳、斷點(diǎn)續(xù)傳實(shí)現(xiàn)

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

    使用minio api實(shí)現(xiàn)分片上傳及斷點(diǎn)續(xù)傳功能。 前端準(zhǔn)備:獲取大文件的MD5值,將文件分片,5M為一分片,排好順序,并按順序命名(1,2,3這種后面比較好合并) 在上傳分片階段,前端有上傳進(jìn)度條 1、檢驗(yàn)文件MD5值 1.1 redis中查看MD5是否存在 1.2 判斷臨時(shí)文件夾是否存在 boolean d

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

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

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

    2024年02月07日
    瀏覽(26)
  • 大文件上傳阿里云oss,分片、斷點(diǎn)續(xù)傳進(jìn)度條展示

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

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

    2024年02月11日
    瀏覽(26)
  • Spring Boot整合Minio實(shí)現(xiàn)上傳憑證、分片上傳、秒傳和斷點(diǎn)續(xù)傳

    Spring Boot整合Minio后,前端的文件上傳有兩種方式: 文件上傳到后端,由后端保存到Minio 這種方式好處是完全由后端集中管理,可以很好的做到、身份驗(yàn)證、權(quán)限控制、文件與處理等,并且可以做一些額外的業(yè)務(wù)邏輯,比如生成縮略圖、提取元數(shù)據(jù)等。 缺點(diǎn)也很明顯: 延遲時(shí)

    2024年02月04日
    瀏覽(24)
  • minio&前后端分離上傳視頻/上傳大文件——前后端分離斷點(diǎn)續(xù)傳&minio分片上傳實(shí)現(xiàn)

    minio&前后端分離上傳視頻/上傳大文件——前后端分離斷點(diǎn)續(xù)傳&minio分片上傳實(shí)現(xiàn)

    ????????分布式文件系統(tǒng)-minio: 第一章:分布式文件系統(tǒng)介紹與minio介紹與使用(附minio java client 使用) 第二章:minio前后端分離上傳視頻/上傳大文件——前后端分離斷點(diǎn)續(xù)傳minio分片上傳實(shí)現(xiàn) 斷點(diǎn)續(xù)傳指的是在下載或上傳時(shí),將下載或上傳任務(wù)(一個(gè)文件或一個(gè)壓縮包

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

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

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

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

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

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

    2024年02月08日
    瀏覽(23)
  • Spring Boot實(shí)現(xiàn)HTTP大文件斷點(diǎn)續(xù)傳分片下載-大視頻分段漸進(jìn)式播放

    服務(wù)端如何將一個(gè)大視頻文件做切分,分段響應(yīng)給客戶端,讓瀏覽器可以漸進(jìn)式地播放。 Spring Boot實(shí)現(xiàn)HTTP分片下載斷點(diǎn)續(xù)傳,從而實(shí)現(xiàn)H5頁面的大視頻播放問題,實(shí)現(xiàn)漸進(jìn)式播放,每次只播放需要播放的內(nèi)容就可以了,不需要加載整個(gè)文件到內(nèi)存中。 文件的斷點(diǎn)續(xù)傳、文件多

    2024年02月14日
    瀏覽(31)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包