断点续传(上传)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. ...
随机推荐
- 7z 一键压缩备份
该批处理已开源 开原地址: 点击进入 磁盘备份 工具有很多,如果你需要增量式备份的话,以下这些方法并不适合你.goodsync 可以了解一下. 以下方式仅适用于,懒人一键压缩备份. 对于我来说 定期的 ...
- 聊聊分布式 SQL 数据库Doris(三)
详细内容阅读: Apache Doris 分区分桶新功能 与 数据划分. 在此基础上做总结与延伸. 在 Doris 的存储引擎规则: 表的数据是以分区为单位存储的,不指定分区创建时,默认就一个分区. ...
- Jdk_HashMap 源码 —— hash(Object)
Jdk 源码 HashMap 的源码是在面试中考的算是比较多的,其中有很多高性能的经典写法,也值得多学习学习. 本文是本人在阅读和学习源码的过程中的笔记(不是教程),如有错误欢迎指正. Jdk Ver ...
- Axure实战应用:Axure设计可视化大屏!
Axure是一款功能强大的原型设计工具,可以用于设计可视化大屏.设计一个有效的可视化大屏需要考虑多个方面,包括布局规划.信息展示.交互设计等. 以下是一个详细的描述,希望对你有所帮助. 第一部分:可视 ...
- nginx的keepalive和keepalive_requests(性能测试TPS波动)
当使用nginx作为反向代理时,为了支持长连接,需要做到两点: 从client到nginx的连接是长连接 从nginx到server的连接是长连接 保持和client的长连接: http { keep ...
- [AGC031E] Snuke the Phantom Thief
Problem Statement A museum exhibits $N$ jewels, Jewel $1, 2, ..., N$. The coordinates of Jewel $i$ a ...
- 寻找市场中的Alpha—WorldQuant的阿尔法设计理念(上)
本文旨在向读者介绍Alpha的相关基本概念,以及寻找和检验Alpha的主要流程和方法.在上篇中我们梳理了 WorldQuant经典读本FindingAlphas的概要以及WebSim的使用,在下篇中我 ...
- 数字孪生结合GIS会给矿业带来怎样的改变
数字孪生技术和GIS的结合为矿业带来了革命性的改变.矿业作为重要的经济支柱,其发展与资源的开采.生产过程的管理密切相关.通过数字孪生和GIS的融合,矿业行业可以实现更高效.可持续的运营和管理,带来许多 ...
- 【C#】【IO】【实例】接上一个统计的新功能
先用Python来创建多层级文件夹: import os root_path = r"C:\Users\Desktop\文案整理\Practice" for item in ran ...
- IDEA将JavaFx打包为exe Win+Mac+Linux多平台分发等等
IDEA将JavaFx打包为exe Win+Mac+Linux多平台分发等等 前面介绍到了用packr打包javafx17为exe多平台分发,比较复杂,这篇则介绍用idea直接打包exe,比较简单,但 ...