Java实现文件分片上传、大文件秒传

Java实现文件分片上传、大文件秒传,Java实现文件分片上传,Java实现大文件秒传,Java实现大文件分片上传,Java实现大文件分块上传,Java实现文件夹上传,Java实现大文件切片上传,Java实现大文件切割上传,Java实现文件批量分片上传,Java实现文件加密上传,

文件比较大,有50G左右,用户希望能够在网页里面直接上传,一期的时候我们是直接用的HTML5的API,也就是chrome提供的API来做的,但是上线后用户反馈不是特别的好用,用户那边有些电脑用的是WIN7+IE9,chrome的API在ie9里面不支持。但是用户系统是支持的,这就把人整的有点不会了。二期的时候我们还是定制开发了,

前端用了JSP,VUE2,VUE3,后端用了JSP,SpringBoot,IDE用了Eclipse,MyEclipse,因为新项目和老项目都用了两种IDE。

用户要求能够在网页上面上传文件夹,文件夹里面大约有1万多个文件,有大有小,大的有1G~10G,小的有几MB,文件夹上传的时候需要保存层级结构,同时能够将层级结构信息保存到数据库中,同时还需要支持文件夹下载,下载下来的文件夹要和上传的文件夹层级结构一模一样。

用户上传的文件比较大,有20G左右,直接用HTML传的话容易失败,服务器也容易出错,需要分片,分块,分割上传。也就是将一个大的文件分成若干个小文件块来上传,另外就是需要实现秒传功能和防重复功能,秒传就是用户如果上传过这个文件,那么直接在数据库中查找记录就行了,不用再上传一次,节省时间,实现的思路是对文件做MD5计算,将MD5值保存到数据库,算法可以用MD5,或者CRC,或者SHA1,这个随便哪个算法都行。

分片还需要支持断点续传,现在HTML5虽然提供了信息记录功能,但是只支持到了会话级,也就是用户不能关闭浏览器,也不能清空缓存。但是有的政府单位上传大文件,传了一半下班了,明天继续传,电脑一关结果进度信息就丢失了,这个是他们的一个痛点。

要求支持断点续传,支持进度信息离线存储,用户可能传一半没有传完,下班了,明天上班后继续上传,电脑晚上到点需要关机,支持加密传输,支持国密加密算法SM4,要求支持下载,支持非打包方式下载,浏览器要求支持包含IE在内的所有浏览器,

系统环境要求支持信创国产化,比如银河麒麟,中标麒麟,统信UOS,龙芯,数据库支持MySQL,Oracle,达梦数据库,人大金仓,需要提供前端源码,后端源码,控件源码,公司自己的项目,也有自己的产品,后续需要集成使用,

要求提供7*24小时技术支持服务,提供文档教程,视频教程,远程技术指导,1对1技术支持服务,提供手机,微信,QQ,邮箱,企业微信等联系方式。

下载示例:

https://gitee.com/xproer/up6-jsp-eclipse/tree/6.5.40/

 

工程

NOSQL

NOSQL示例不需要任何配置,可以直接访问测试

创建数据表

选择对应的数据表脚本,这里以SQL为例

修改数据库连接信息

访问页面进行测试

文件存储路径

up6/upload/年/月/日/guid/filename


 

  


相关问题:
1.javax.servlet.http.HttpServlet错误
2.项目无法发布到tomcat
3.md5计算完毕后卡住
4.服务器找不到config.json文件

相关参考:

文件保存位置

源码工程文档:泽优上传下载-源码版-工程文档.pdf

源码报价单:泽优上传下载-源码版-2024.pdf

OEM版报价单:泽优上传下载-OEM版-2024.pdf

控件源码下载:https://drive.weixin.qq.com/s?k=ACoAYgezAAwbdKCskc

  • 18
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现文件分片并且断点续的一种常见方案是使用HTTP协议,将大文件进行分片,每个分片的大小可以根据具体情况设置,通常是几十KB到几百KB不等。上过程中,服务器接收到每个分片后,将其存储到磁盘上。 同时,为了实现断点续,客户端需要在上前检查服务器上是否已经存在相同的文件。如果已存在,则客户端需要向服务器发送一个请求,以获取已上分片的信息,然后继续上未上分片。 下面是使用Java语言实现文件分片并且断点续的示例代码: ```java import java.io.*; import java.net.HttpURLConnection; import java.net.URL; public class FileUploader { private static final String BOUNDARY = "----WebKitFormBoundary7MA4YWxkTrZu0gW"; public static void main(String[] args) throws Exception { String filePath = "C:\\test\\largeFile.zip"; String url = "http://localhost:8080/upload"; File file = new File(filePath); long fileSize = file.length(); int chunkSize = 1024 * 1024; // 1MB int chunkCount = (int) Math.ceil((double) fileSize / chunkSize); for (int i = 0; i < chunkCount; i++) { int start = i * chunkSize; int end = (i + 1) * chunkSize; if (end > fileSize) { end = (int) fileSize; } uploadChunk(url, file.getName(), i, chunkCount, start, end, file); } } private static void uploadChunk(String url, String fileName, int chunkIndex, int chunkCount, int start, int end, File file) throws Exception { URL uploadUrl = new URL(url); HttpURLConnection connection = (HttpURLConnection) uploadUrl.openConnection(); connection.setRequestMethod("POST"); connection.setDoOutput(true); connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDARY); DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream()); outputStream.writeBytes("--" + BOUNDARY + "\r\n"); outputStream.writeBytes("Content-Disposition: form-data; name=\"file\"; filename=\"" + fileName + "\"\r\n"); outputStream.writeBytes("Content-Type: application/octet-stream\r\n\r\n"); FileInputStream inputStream = new FileInputStream(file); inputStream.skip(start); byte[] buffer = new byte[1024]; int len; int uploadedBytes = start; while (uploadedBytes < end && (len = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, len); uploadedBytes += len; } inputStream.close(); outputStream.writeBytes("\r\n--" + BOUNDARY + "\r\n"); outputStream.writeBytes("Content-Disposition: form-data; name=\"chunkIndex\"\r\n\r\n"); outputStream.writeBytes(String.valueOf(chunkIndex) + "\r\n"); outputStream.writeBytes("--" + BOUNDARY + "\r\n"); outputStream.writeBytes("Content-Disposition: form-data; name=\"chunkCount\"\r\n\r\n"); outputStream.writeBytes(String.valueOf(chunkCount) + "\r\n"); outputStream.writeBytes("--" + BOUNDARY + "--\r\n"); outputStream.flush(); outputStream.close(); int responseCode = connection.getResponseCode(); if (responseCode != HttpURLConnection.HTTP_OK) { throw new RuntimeException("Failed to upload chunk: " + chunkIndex); } } } ``` 上述代码将文件分成若干个分片,每个分片大小为1MB,然后逐个上到服务器。其中,`uploadChunk()`方法用于上单个分片,它将分片数据和分片信息一起发送到服务器。服务器需要根据分片信息将所有分片组合成完整的文件。 此外,为了实现断点续,还需要在服务器端实现一个接口,用于获取已上分片的信息,并返回给客户端。在上前,客户端需要向服务器发送一个请求,以获取已上分片的信息,然后继续上未上分片。在上过程中,客户端需要记录已上分片信息,以便在上失败后能够恢复上进度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值