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

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

时间:2023-09-21 13:55:07浏览次数:31  
标签:文件 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

五、实现分片上传+断点续传
关于这方面的前后端实现,网上有一大推,可以参考:
https://blog.csdn.net/qq_31448387/article/details/127983860
https://blog.csdn.net/shark_chili3007/article/details/118385682
总结一下:
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%e5%a4%a7%e6%96%87%e4%bb%b6%e4%b8%8a%e4%bc%a0%ef%bc%88%e7%a7%92%e4%bc%a0%e3%80%81%e5%88%86%e7%89%87%e4%b8%8a%e4%bc%a0%e3%80%81%e6%96%ad%e7%82%b9%e7%bb%ad%e4%bc%a0%ef%bc%89/

欢迎入群一起讨论

 

 

标签:文件,Java,读取,断点续传,偏移量,randomAccessFile,分片,上传
From: https://www.cnblogs.com/songsu/p/17719798.html

相关文章

  • Javascript中window.setInterval和window.setTimeout的区别
    在使用JScript的时候,我们有时需要间隔的执行一个方法,比如用来产生网页UI动画特效啥的。这是我们常常会使用方法setInterval或setTimeout,但是由于这两个方法是由脚本宿主模拟出来的Timer线程,在通过其调用我们的方法是不能为其传递参数。我们常用的使用场景是:代码如下:window.setTi......
  • 无涯教程-JavaScript - COUNTIF函数
    描述COUNTIF函数计算符合条件的单元格数。语法COUNTIF(range,criteria)争论Argument描述Required/Optionalrange您要计数的单元格组。范围可以包含数字,数组,命名范围或包含数字的引用。空白和文本值将被忽略。RequiredcriteriaAnumber,expression,cellr......
  • JavaScript函数大全 集合
    JavaScript函数大全集合javascript提供了许多函数供开发人员使用,下面给出一个简单介绍,更详细的信息请参考VisualInterDev提供的在线帮助。javascript函数一共可分为五类:·常规函数·数组函数·日期函数·数学函数·字符串函数1.常规函......
  • asp 上传
    化境ASP无组件上传类-upload_5xsoft使用手册2.0what'snew1.使用了网友“梁无惧”提供的高效的处理方式,上传速度可提高一倍以上,可上传更大的文件。2.添加了form方法和file方法,把原来的form集和file改为objForm和objFile,避免了若上传时没......
  • Java 21 新特性:Record Patterns
    RecordPatterns第一次发布预览是在JDK19、随后又在JDK20中进行了完善。现在,Java21开始正式推出该特性优化。下面我们通过一个例子来理解这个新特性。recordPoint(intx,inty){}staticvoidprintSum(Objectobj){if(objinstanceofPointp){intx=......
  • 如何将typora的文件上传到博客园
    参考:https://www.cnblogs.com/HeroZhang/p/17534095.htmlhttps://www.cnblogs.com/HeroZhang/p/17534095.html......
  • Java实战:大文件分片上传与断点续传策略及其实际应用
    在许多应用场景中,处理大型文件上传可能成为开发人员面临的一项挑战。在网络环境不稳定,或者文件体积过大的情况下,传统的文件上传方式可能会出现问题。这时,文件分片上传和断点续传技术就显得至关重要。本文将向您展示如何使用Java实现这两种技术,并探讨其主要应用场景。文件分片上传......
  • centos中自带java的路径配置
    centos自带的java,可以直接运行java,但不知道是怎么访问到的,所以就查了一下[root@aaa]#java-versionopenjdkversion"1.8.0_262"OpenJDKRuntimeEnvironment(build1.8.0_262-b10)OpenJDK64-BitServerVM(build25.262-b10,mixedmode)查看版本号,可以看到能访问ja......
  • Java 的值传递与引用传递
     实参与形参我们都知道,在Java中定义方法的时候是可以定义参数的。比如Java中的main方法,publicstaticvoidmain(String[]args),这里面的args就是参数。参数在程序语言中分为形式参数和实际参数。形式参数:是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时......
  • Java字符串转换为日期和时间比较大小
    方法一:DateFormatfmt=newSimpleDateFormat("yyyy-MM-dd");StringdateBegin=fmt.format(carrierCommand.getDateBegin());StringdateEnd=fmt.format(carrierCommand.getDateEnd());//如果获得的日期格式不是'2008-05-22',就必须要格式化一下日期StringdateBegin=......