首页 > 编程语言 >Java大文件上传(秒传、分片上传、断点续传)

Java大文件上传(秒传、分片上传、断点续传)

时间:2023-10-27 13:36:07浏览次数:42  
标签:文件 Java 读取 断点续传 偏移量 randomAccessFile 分片 上传

一、秒传
秒传就是不传,实现逻辑就是看数据库或者缓存里是否已经有这个文件了,有了,直接从已有的文件去拿就可以了(返回文件地址)。
这里判断是否是相同文件,要用到信息摘要算法,详情可以参考:一文读懂当前常用的加密技术体系。
信息摘要算法常常被用来保证信息的完整性,防止信息在传输过程中被篡改(无法确定信息是否被监听)。常用的就是MD5算法。

二、分片上传
分片上传,就相当于把一个大文件,拆成很多个小份,就想hls文件一样,一片一片的,上传完成后组合起来形成一个完整的文件。
一般和断点续传一起使用。

三、断点续传
分片上传过程中,会话失效、网络问题、系统问题导致的上传中断,恢复后再次上传,不用从头开始了,就是断点续传。

四、RandomAccessFile类
支持随意跳转到文件的任意位置进行读写,RandomAccessFile类的作用就很明显了,可以支持分片上传和断点续传。
其部分源码如下:

public RandomAccessFile(File file, String mode)
        throws FileNotFoundException
    {
        String name = (file != null ? file.getPath() : null);
        int imode = -1;
        if (mode.equals("r"))
            imode = O_RDONLY;
        else if (mode.startsWith("rw")) {
            imode = O_RDWR;
            rw = true;
            if (mode.length() > 2) {
                if (mode.equals("rws"))
                    imode |= O_SYNC;
                else if (mode.equals("rwd"))
                    imode |= O_DSYNC;
                else
                    imode = -1;
            }
        }
        ......
        fd = new FileDescriptor();
        fd.attach(this);
        path = name;
        open(name, imode);
    }

 r : 只读模式。
rw: 读写模式
rws: 相对于 rw,rws 同步更新对“文件的内容”或“元数据”的修改到外部存储设备。
rwd : 相对于 rw,rwd 同步更新对“文件的内容”的修改到外部存储设备。

文件内容指的是文件中实际保存的数据,元数据则是用来描述文件属性比如文件的大小信息、创建和修改时间。
代码示例:

public static void main(String[] args) throws IOException {
        RandomAccessFile randomAccessFile = new RandomAccessFile(new File("input.txt"), "rw");
        System.out.println("读取之前的偏移量:" + randomAccessFile.getFilePointer() +
                ",当前读取到的字符" + (char) randomAccessFile.read() +
                ",读取之后的偏移量:" + randomAccessFile.getFilePointer());
        randomAccessFile.seek(4);
        // 从偏移量 4 的位置开始往后写入字节数据
        randomAccessFile.write(new byte[]{'H', 'I', 'J', 'K','L','M'});
        System.out.println("读取之前的偏移量:" + randomAccessFile.getFilePointer() +
                ",当前读取到的字符" + (char) randomAccessFile.read() +
                ",读取之后的偏移量:" + randomAccessFile.getFilePointer());    }

write()方法是覆盖写入,对于input.txt文件,初始值是ABCDE,执行后值是ABCDHIJKLM,执行结果如下:

读取之前的偏移量:0,当前读取到的字符A,读取之后的偏移量:1
读取之前的偏移量:10,当前读取到的字符,读取之后的偏移量:10

五、实现分片上传+断点续传
关于这方面的前后端实现,网上有一大推,
总结一下:
1、前端实现
(1)利用file.slice(start,end)方法将文件分片,获取总分片数、当前分片序号、当前分片文件;
(2)将以上信息传入后端,期间定义文件MD5摘要,确定断传后能够秒传;
(3)当分片序号==总分片数时,将状态(end)传给后端,通知后端合并分片文件。(并发情况下,定义标志位,确认每一个分片上传完成通知合并。)
2、后端实现
RandomAccessFile 实现合并的核心代码如下:

RandomAccessFile raf = new RandomAccessFile(file,"rw");
raf.seek(keyIndex);//seek(int n)从n处处理
byte[] bytes = fileValue.getBytes();//提区文件的字节流
raf.write(bytes);//上面的seek方法已经把指针放在这里从这直接写入

参考文章:http://blog.ncmem.com/wordpress/2023/09/21/java大文件上传(秒传、分片上传、断点续传)/


 

标签:文件,Java,读取,断点续传,偏移量,randomAccessFile,分片,上传
From: https://blog.51cto.com/u_14023400/8053014

相关文章

  • Java实战:大文件分片上传与断点续传策略及其实际应用
    在许多应用场景中,处理大型文件上传可能成为开发人员面临的一项挑战。在网络环境不稳定,或者文件体积过大的情况下,传统的文件上传方式可能会出现问题。这时,文件分片上传和断点续传技术就显得至关重要。本文将向您展示如何使用Java实现这两种技术,并探讨其主要应用场景。文件分片上传是......
  • Vue项目中大文件切片上传实现秒传、断点续传的详细实现教程
    一、考察点在Vue项目中,大图片和多数据Excel等大文件的上传是一个非常常见的需求。然而,由于文件大小较大,上传速度很慢,传输中断等问题也难以避免。因此,为了提高上传效率和成功率,我们需要使用切片上传的方式,实现文件秒传、断点续传、错误重试、控制并发等功能,并绘制进度条。在本文中,我......
  • 如何实现大文件上传:秒传、断点续传、分片上传
    前言文件上传是一个老生常谈的话题了,在文件相对比较小的情况下,可以直接把文件转化为字节流上传到服务器,但在文件比较大的情况下,用普通的方式进行上传,这可不是一个好的办法,毕竟很少有人会忍受,当文件上传到一半中断后,继续上传却只能重头开始上传,这种让人不爽的体验。那有没有比较好的......
  • [26章]Java主流分布式解决方案多场景设计与实战
    点击下载:[26章]Java主流分布式解决方案多场景设计与实战 提取码:q5p5 Java主流分布式解决方案多场景设计与实战课程,计划26章,同步更新中。随着互联网数据井喷式的发展,分布式技术应运而生。分布式因其高性能、高可用、高扩展的特点,成为微服务项目的基石。本课程针对分布式六大主流问......
  • 甲骨文真的要开放Java EE?
    甲骨文表示,目前正在与可能的几个候选基金会,以及许可证持有者和社区在进行谈判。随着JavaEE8平台的确定,甲骨文在周四表示,目前正在考虑将JavaEnterpriseEdition技术转移到开源社区。甲骨文在其博客中说道,这次的转移,可能是正确的下一步行动,为了采用更灵活的流程,实现更灵......
  • javaweb--sql查询DQL
    基础查询别名selectmathas'数学成绩'english'英语成绩'fromstu条件查询几点注意事项1、null值的比较不能用=或者!=,只能使用isnull或者isnotnull2、可以使用betweenand来匹配一段数值whereagebetween20and303、<>和!=的作用相同4、or可以用数组的形式表示......
  • Java拾贝第十一天——IO流之打印流
    Java拾贝不建议作为0基础学习,都是本人想到什么写什么在整个IO包中,打印流是输出信息最方便的类。主要包括字节打印流(PrintStream)和字符打印流(PrintWriter)打印流没有输入流,所以没有输入输出这个说法,都是输出PrintStream字节打印属于OutputStream的子类,PrintStream的构造方......
  • Java中logback的学习
    转:https://blog.csdn.net/lijiafa/article/details/109465399Logback常用配置介绍LOGBack简介官方手册:https://logback.qos.ch/manual/introduction.html介绍作者CekiGülcü在Java日志领域世界知名。他创造了Log4J,这个最早的Java日志框架即便在JRE内置日志功能的竞争下仍然......
  • JAVA SWING之JFrame和JPanel布局
    初学JAVA的时候学习过SWING,每次写程序就直接复制Jframe和Jpanel设置,再调一下大小(不知道有没有人跟我一样),到现在也不清楚它们有什么关系,才回顾学习。Swing虽然是很老的技术了,但也有很多工具是Swing写的例如JetBrains系列,最常用的IDEA。开发一下小工具还是不错的。掌握整体布局后,再......
  • .net 上传附件错误
     错误net::ERR_CONNECTION_ABORTED 导致这种错误的主要原因是上传的文件太大,服务器不能继续读取请求而过早中断链接Failedtoloadresource:theserverrespondedwithastatusof413()开发环境(IISExpress)1073741824=1GB根目录下创建 web.config 文件,内容如下<......