断点续传(上传)Java版
PostMan 客户端调用部分见,断点续传(上传)C#版
1. 客户每次上传前先获取一下当前文件已经被服务器接受了多少
2. 上传时设定偏移量,跳过服务器已收到的长度
@SpringBootTest
public class FileTests { @Test
void seekTest() {
try {
RandomAccessFile writeFile = new RandomAccessFile("D:\\temp\\1.txt", "rw");
writeFile.seek(2);
writeFile.write("-VipSoft-".getBytes());
} catch (Exception ex) {
ex.printStackTrace();
}
}
}

package com.vipsoft.api; import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.StrUtil;
import com.vipsoft.api.base.util.ApiResult;
import com.vipsoft.api.base.util.BuinessCodeEnum;
import com.vipsoft.api.base.util.PojoUtil;
import com.vipsoft.api.base.vo.UploadFileModel;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile; /**
* 断点续传
*/
@Api(tags = "断点续传接口")
@RestController
@RequestMapping("/upload")
public class UploadController { private Logger logger = LoggerFactory.getLogger(this.getClass()); String savePath = "D:\\temp\\UpdateSystem"; //TODO 配置文件 /**
* 获取已上传文件大小
* @param request
* @param param
* @return
*/
@ApiOperation(value = "获取已上传文件大小", notes = "")
@PostMapping("/getFileLength")
public ApiResult getFileLength(HttpServletRequest request, @RequestBody UploadFileModel param) {
//判断入参是否为空
ApiResult result = new ApiResult();
try {
String fileName = "";
if (param != null) {
fileName = param.getFileName();
}
if (StrUtil.isEmpty(fileName)) {
//实体没有就从Header 里面取
fileName = request.getHeader("FileName");
}
if (StrUtil.isEmpty(fileName)) {
result.setBussinessCode(6001);
;
result.setBussinessMsg("FileName 文件名不能为空");
result.setBussinessData(0);
return result;
}
//设置文件存放路径
//string dir = HttpContext.Current.Server.MapPath(SavePath);
fileName = savePath + "\\" + fileName;
String msg = "";
if (FileUtil.exist(fileName)) {
File file = new File(fileName);
result.setBussinessData(file.length());
msg = StrUtil.indexedFormat("FileName => {0} Length => {1}", fileName, file.length());
} else {
result.setBussinessData(0);
msg = StrUtil.indexedFormat("文件不存在 FileName => {0} Length => 0", fileName);
}
result.setBussinessMsg("获取成功!");
result.setBussinessCode(0);
msg = StrUtil.indexedFormat("文件不存在 FileName => {0} Length => 0", fileName);
logger.info("获取文件长度 => {}", msg); } catch (Exception ex) {
logger.error(PojoUtil.pojoToJson(param));
logger.error(ex.getMessage(), ex);
result.setBussinessCode(BuinessCodeEnum.ERROR.getCode());
result.setBussinessMsg(ex.getMessage());
}
return result;
} /**
* 上传文件
* @param request
* @return
*/
@ApiOperation(value = "获取已上传文件大小", notes = "")
@PostMapping("/uploadFile")
public ApiResult uploadFile(HttpServletRequest request, @RequestParam(value = "File") MultipartFile file) {
//判断入参是否为空
ApiResult result = new ApiResult();
String fileName = "";
try {
fileName = request.getParameter("FileName");
long offset = 0;
String offsetStr = request.getHeader("Offset");
if (StrUtil.isEmpty(offsetStr)) {
offsetStr = request.getParameter("Offset");
}
if (StrUtil.isNotEmpty(offsetStr)) {
offset = Long.valueOf(offsetStr);
}
if (StrUtil.isEmpty(fileName)) {
logger.error("FileName 上传文件名不能为空");
result.setBussinessCode(6002);
result.setBussinessMsg("FileName 上传文件名不能为空");
result.setBussinessData(false);
return result;
}
File dir = new File(savePath);
//如果不存在文件夹,就创建文件夹
if (!dir.exists()) {
dir.mkdir();
}
String saveFileName = savePath + "\\" + fileName;
RandomAccessFile writeFile = new RandomAccessFile(saveFileName, "rw");
writeFile.seek(offset); String ss = file.getName(); long upLoadLength = file.getSize();
writeFile.write(file.getBytes()); result.setBussinessCode(0);
result.setBussinessMsg("上传成功!");
result.setBussinessData(true); logger.info("上传文件 {} Offset => {} File.ContentLength => {} => {}", fileName, offset, upLoadLength, saveFileName);
} catch (IOException e) {
result.setBussinessCode(6003);
result.setBussinessMsg(e.getMessage());
result.setBussinessData(false);
logger.error(e.getMessage() + " => " + fileName, e);
}
return result;
} }
public class UploadFileModel implements Serializable {
@JsonProperty("FileName")
private String fileName;
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
}
断点续传(上传)Java版的更多相关文章
- h5语音录制及上传(Java版语音聊天系统)
Since Chrome version 47, Voice Recording works only on HTTPS sites 目前基于webikit(谷歌之类的webikit)和Gecko(F ...
- wepy开发小程序 大坑....本地调试ok,小程序上传体验版 组件出现问题
如果你碰到的上述问题(本地调试ok,小程序上传体验版 各种莫名其妙的问题-卡死-组件属性失效-$apply()不起作用) 您需要关闭 微信开发者工具中: 1.微信开发者工具-->项目--> ...
- 分享知识-快乐自己:FastDFS 上传 java 源码
FastDFS 上传 java 源码:点我下载源码 首先导入 POM 文件:解决 maven 不能下载 fastdfs-client-java JAR <dependency> <g ...
- java实现多线程断点续传,上传下载
采用apache 的 commons-net-ftp-ftpclient import java.io.File; import java.io.FileOutputStream; import ja ...
- 前后端分离跨服务器文件上传-Java SpringMVC版
近来工作上不上特别忙,加上对后台java了解一点,所以就抽时间,写了一个java版本的前后端分离的跨服务器文件上传功能,包括前后端代码. 一.Tomcat服务器部分 1.Tomcat服务器 单独复制一 ...
- java http大文件断点续传上传
因为需要研究下断点上传的问题.找了很久终于找到一个比较好的项目. 效果: 上传中,显示进度,时间,百分比. 点击[Pause]暂停,点击[Resume]继续. 2,代码分析 项目进行了封装使用最简单的 ...
- java文件断点续传上传下载解决方案
这里只写后端的代码,基本的思想就是,前端将文件分片,然后每次访问上传接口的时候,向后端传入参数:当前为第几块文件,和分片总数 下面直接贴代码吧,一些难懂的我大部分都加上注释了: 上传文件实体类: 看得 ...
- 记录: 百度webuploader 分片文件上传java服务器端(spring mvc)示例的优化
最近项目上用到文件分片上传,于是找到了百度的一个开源前端控件webuploader. 于是尝试使用. 下载下来后,它提供的服务器端示例代码是php版的,那么Java版的呢? 其实,上传文件都是按照rf ...
- .net 实现上传文件分割,断点续传上传文件
一 介绍 断点续传搜索大部分都是下载的断点续传,涉及到HTTP协议1.1的Range和Content-Range头. 来个简单的介绍 所谓断点续传,也就是要从文件已经下载的地方开始继续下载.在以前版本 ...
- ftp上传java代码
<欢迎转载http://www.cnblogs.com/shizhongtao/p/3345826.html> 上传代码就写个简单的小例子.首先要加入jar包.commons-net-1. ...
随机推荐
- deepin解决文件管理器打不开和桌面黑屏的问题
总结 deepin 的优点是上手非常容易, 但截止当前(2021-6-24)的使用来说稳定性还不是非常好. 今天就遇到了无法显示桌面的问题,可以参照如下解决办法.只需使用红色框中的命令即可. 图片转载 ...
- .NET 8正式发布
11 月 15 日开始的为期三天的 .NET Conf 在线活动的开幕日上,.NET 8作为微软的开源跨平台开发平台正式发布..NET 团队着重强调云.性能.全栈 Blazor.AI 和 .NET M ...
- L3-002 特殊堆栈
#include <bits/stdc++.h> using namespace std; const int N = 1E5 + 10; int tr[N]; stack<int& ...
- 基础练习:FJ的字符串
问题描述 FJ在沙盘上写了这样一些字符串: A1 = "A" A2 = "ABA" A3 = "ABACABA" A4 = "AB ...
- Vue源码学习(十七):实现computed计算属性
好家伙,本章我们尝试实现computed属性 0.完整代码已开源 https://github.com/Fattiger4399/analytic-vue.git 1.分析 1.1computed的常 ...
- 向“创新者”升阶,程序员当下如何应对 AI 的挑战
随着 AI 技术的飞速发展,特别是大模型的出现,传统的程序员角色正在经历深刻的变革,我们不得不重新对自己进行审视和思考. 通用领域大模型的"泛化能力" 在过去的二十年内,AI 领域 ...
- Linux笔记03: Linux常用命令_3.1命令的基本格式
3.1命令的基本格式 3.1.1 命令提示符 [root@localhost ~]# 这就是Linux系统的命令提示符.各部分含义如下: ●[]:这是提示符的分隔符号,没有特殊含义. ●root:显示 ...
- Object.defineProperty用法
1.能干啥? Object.defineProperty()可以给传入的对象动态的添加或修改属性 2.怎么玩? Object.defineProperty(obj,prop,desc)它有三个参数: ...
- 数字孪生与GIS的结合:创新灾害预防管理的未来
近年来,全球频发的自然灾害给人们的生命和财产安全带来了巨大威胁,灾害预防管理成为当务之急.然而,随着数字孪生技术和GIS的迅猛发展,一种全新的解决方案正在崭露头角.数字孪生与GIS的结合,为灾害预防管 ...
- 用Python写一个简单的TCP客户端和服务端
在渗透测试过程中,经常需要创建一个TCP客户端,用来测试服务.发送数据.进行 fuzz 等等.如果黑客潜伏在某大型企业的内网环境中,则不太可能直接获取网络工具或编译器,有时甚至连复制/粘贴或者连接外网 ...