断点续传(上传)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. ...
随机推荐
- 02Java学习_注意事项和学习方法
02_Java 开发注意事项细节和学习方法 目录 02_Java 开发注意事项细节和学习方法 注意事项 学习方法 注意事项 .java 是 Java 文件的拓展名.源文件的基本组成部分是类--clas ...
- 推荐一个Node.js多版本管理的可视化工具
关于Node.js的开发者来说,在开发机器上管理多个不同版本的Node.js是一个常见痛点.之前在开发者安全大全专栏中,提到过解决方法:使用nvm,如果对于nvm还不了解的话,可以前往了解. 对于TJ ...
- P5318 查阅文献
题意大概意思就是分别用dfs与bfs遍历一个图,特殊要求是从编号小的点开始遍历. 用邻接表存图,至今我也没想明白怎么才可以从编号小的点开始遍历,明白是排序,但是不知道如何排序,题解中的排序方法是:按照 ...
- GeminiDB新特性:让Redis广告频控爱不释手的exHASH
本文分享自华为云社区<GeminiDB新特性:让Redis广告频控爱不释手的exHASH>,作者:GeminiDB-Redis博客 . exHash类型是一种支持Field过期的新型数据类 ...
- Modbus转PROFINET网关助力电子天平与西门子PLC无缝对接
背景: 在制药.食品科学和其他行业中,电子天平被广泛用于质量控制和分析实验.它们可以用于检测样品的净重.含量和浓度,并用于监测产品的制造过程. 常州某反应器公司实验室近期采购一批电子天平,现需要把电子 ...
- 品牌全渠道营销系统如何与不同经销商ERP打通
品牌商在与各经销商ERP系统打通方面面临的挑战.传统的ERP系统往往使得数据收集和合作变得繁琐且低效,导致市场响应迟缓,影响整体的供应链管理和市场决策.我们的解决方案旨在破解这一难题,提供一个全渠道营 ...
- mac中删除本地maven库中下载失败的.lastUpdated文件
在 macOS 中,要删除本地 Maven 仓库中所有的 .lastUpdated 文件,您可以使用 find 命令结合 rm 命令来执行这个操作.这可以在终端(Terminal)中完成. 打开您的终 ...
- 【JSOI2008】火星人 (哈希+Splay)
题目 这种含有修改操作的就难以用后缀数组实现了,求LCP这种区间相等的类型可以想到用hash判断,同时LCP的答案大小符合二分条件可以二分求出,如果只有修改可以用线段树维护,因为还有有插入操作所以想到 ...
- java当中组件和窗口的相容问题(里面包含了这些方法的作用)
窗口也称为容器,在书中大部分称为容器,这里主要讲的是底层容器. JFrame():创建一个无标签的窗口. JFrame(String s):创建标题为s的窗口 setBounds(int a,int ...
- [cnn]FashionMINST训练+保存模型+调用模型判断给定图片
import torch import torch.nn as nn import torch.nn.functional as F import torch.optim as optim impor ...