springboot 、html分片上传,断点续传

这篇具有很好参考价值的文章主要介绍了springboot 、html分片上传,断点续传。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

springboot 、html分片上传,断点续传

  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;
        // 可保存到数据库
        Map<String, Object> map = new HashMap<>();
        map.put("url", resourceUrl);
        return new Result().ok(map);
    }

注意:合并分片代码中:
Files.write(mergedFilePath, Files.readAllBytes(chunkFilePath), StandardOpenOption.APPEND);文章来源地址https://www.toymoban.com/news/detail-445821.html

如果不设置该值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; // 每个块的大小(字节)
            const fileSize = file.size; // 文件的总大小
            const totalChunks = Math.ceil(fileSize / chunkSize); // 文件被分成的总块数

            let chunkNumber = 0; // 当前上传的块的编号
            let startByte = 0; // 当前上传块的起始字节位置
            let endByte = chunkSize; // 当前上传块的结束字节位置(不包括)

            uploadChunk();

            function uploadChunk() {
                const chunk = file.slice(startByte, endByte); // 获取当前上传块的内容
                const formData = new FormData(); // 创建FormData对象

                // 将参数添加到FormData对象中
                formData.append("file", chunk);
                formData.append("chunkNumber", chunkNumber);
                formData.append("totalChunks", totalChunks);
                formData.append("fileName", file.name);
                formData.append("fileSize", fileSize);

                // 创建XMLHttpRequest对象
                const xhr = new XMLHttpRequest();
                xhr.open("POST", url, true);

                // 监听XMLHttpRequest对象的事件
                xhr.onload = function() {
                    if (xhr.status === 200) {
                        // 上传成功,继续上传下一块
                        chunkNumber++;
                        startByte = endByte;
                        endByte = Math.min(startByte + chunkSize, fileSize);
                        if (startByte < fileSize) {
                            uploadChunk();
                        } else {
                            // 所有块上传成功
                            console.log("Upload completed");
                        }
                    } else {
                        // 上传失败,尝试重传当前块
                        console.error(xhr.statusText);
                        setTimeout(uploadChunk, 1000);
                    }
                };

                xhr.onerror = function() {
                    // 网络错误,尝试重传当前块
                    console.error(xhr.statusText);
                    setTimeout(uploadChunk, 1000);
                };

                // 发送POST请求
                xhr.send(formData);
            }
        }
    </script>
</body>
</html>

到了这里,关于springboot 、html分片上传,断点续传的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 前端文件上传(文件上传,分片上传,断点续传)

    普通文件上传 思路: 首先获取用户选择的文件对象,并将其添加到一个 FormData 对象中。然后,使用 axios 的 post 方法将 FormData 对象发送到服务器。在 then 和 catch 中,我们分别处理上传成功和失败的情况,并输出相应的信息。 需要注意,在使用 axios 进行文件上传时,必须将

    2024年02月22日
    浏览(31)
  • Minio大文件分片上传、断点续传实现

    使用minio api实现分片上传及断点续传功能。 前端准备:获取大文件的MD5值,将文件分片,5M为一分片,排好顺序,并按顺序命名(1,2,3这种后面比较好合并) 在上传分片阶段,前端有上传进度条 1、检验文件MD5值 1.1 redis中查看MD5是否存在 1.2 判断临时文件夹是否存在 boolean d

    2024年02月09日
    浏览(39)
  • 前端 + 后端 实现分片上传(断点续传/极速秒传)

    先记录下,后面有时间再去实现 (已实现,可参考 SpringBoot+vue文件上传下载预览大文件分片上传文件上传进度 SpringBoot+vue 大文件分片下载) 可参考链接:vue上传大文件/视频前后端(java)代码 前端slice分片上传,后端用表记录分片索引和分片大小和分片总数,当接受完最后

    2023年04月17日
    浏览(39)
  • spring boot 阿里云oss 文件分片上传、断点续传

    文章目录 前言 一、申请阿里云oss 二、上代码 总结       阿里云对象存储OSS(Object Storage Service)是一款海量、安全、低成本、高可靠的云存储服务,可提供99.9999999999%(12个9)的数据持久性,99.995%的数据可用性。多种存储类型供选择,全面优化存储成本。     您可以使用阿

    2024年02月07日
    浏览(38)
  • 大文件上传阿里云oss,分片、断点续传进度条展示

    前端页面展示 大文件如果不采用分片上传会导致卡死、内存占用过高导致程序奔溃等一些列问题。 通常在文件大于100 MB的情况下,建议采用分片上传的方法,通过断点续传和重试,提高上传成功率。如果在文件小于100 MB的情况下使用分片上传,且partSize设置不合理的情况下,

    2024年02月11日
    浏览(36)
  • Spring Boot整合Minio实现上传凭证、分片上传、秒传和断点续传

    Spring Boot整合Minio后,前端的文件上传有两种方式: 文件上传到后端,由后端保存到Minio 这种方式好处是完全由后端集中管理,可以很好的做到、身份验证、权限控制、文件与处理等,并且可以做一些额外的业务逻辑,比如生成缩略图、提取元数据等。 缺点也很明显: 延迟时

    2024年02月04日
    浏览(35)
  • minio&前后端分离上传视频/上传大文件——前后端分离断点续传&minio分片上传实现

    🍀🍀🍀🍀分布式文件系统-minio: 第一章:分布式文件系统介绍与minio介绍与使用(附minio java client 使用) 第二章:minio前后端分离上传视频/上传大文件——前后端分离断点续传minio分片上传实现 断点续传指的是在下载或上传时,将下载或上传任务(一个文件或一个压缩包

    2024年02月03日
    浏览(39)
  • 基于vue-simple-uploader封装文件分片上传、秒传及断点续传的全局上传

    1. 前言 文件上传 小文件(图片、文档、视频)上传可以直接使用很多ui框架封装的上传组件,或者自己写一个input 上传,利用FormData 对象提交文件数据,后端使用spring提供的MultipartFile进行文件的接收,然后写入即可。但是对于比较大的文件,比如上传2G左右的文件(http上传

    2024年02月06日
    浏览(35)
  • SpringBoot + minio实现分片上传、秒传、续传

    MinIO是一个基于Go实现的高性能、兼容S3协议的对象存储。它采用GNU AGPL v3开源协议,项目地址是https://github.com/minio/minio。 引用官网: MinIO是根据GNU Affero通用公共许可证v3.0发布的高性能对象存储。它与Amazon S3云存储服务兼容。使用MinIO构建用于机器学习,分析和应用程序数据工

    2024年02月08日
    浏览(44)
  • Spring Boot实现HTTP大文件断点续传分片下载-大视频分段渐进式播放

    服务端如何将一个大视频文件做切分,分段响应给客户端,让浏览器可以渐进式地播放。 Spring Boot实现HTTP分片下载断点续传,从而实现H5页面的大视频播放问题,实现渐进式播放,每次只播放需要播放的内容就可以了,不需要加载整个文件到内存中。 文件的断点续传、文件多

    2024年02月14日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包