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版的更多相关文章

  1. h5语音录制及上传(Java版语音聊天系统)

    Since Chrome version 47, Voice Recording works only on HTTPS sites 目前基于webikit(谷歌之类的webikit)和Gecko(F ...

  2. wepy开发小程序 大坑....本地调试ok,小程序上传体验版 组件出现问题

    如果你碰到的上述问题(本地调试ok,小程序上传体验版 各种莫名其妙的问题-卡死-组件属性失效-$apply()不起作用) 您需要关闭 微信开发者工具中: 1.微信开发者工具-->项目--> ...

  3. 分享知识-快乐自己:FastDFS 上传 java 源码

    FastDFS 上传 java 源码:点我下载源码 首先导入 POM 文件:解决 maven 不能下载 fastdfs-client-java JAR <dependency> <g ...

  4. java实现多线程断点续传,上传下载

    采用apache 的 commons-net-ftp-ftpclient import java.io.File; import java.io.FileOutputStream; import ja ...

  5. 前后端分离跨服务器文件上传-Java SpringMVC版

    近来工作上不上特别忙,加上对后台java了解一点,所以就抽时间,写了一个java版本的前后端分离的跨服务器文件上传功能,包括前后端代码. 一.Tomcat服务器部分 1.Tomcat服务器 单独复制一 ...

  6. java http大文件断点续传上传

    因为需要研究下断点上传的问题.找了很久终于找到一个比较好的项目. 效果: 上传中,显示进度,时间,百分比. 点击[Pause]暂停,点击[Resume]继续. 2,代码分析 项目进行了封装使用最简单的 ...

  7. java文件断点续传上传下载解决方案

    这里只写后端的代码,基本的思想就是,前端将文件分片,然后每次访问上传接口的时候,向后端传入参数:当前为第几块文件,和分片总数 下面直接贴代码吧,一些难懂的我大部分都加上注释了: 上传文件实体类: 看得 ...

  8. 记录: 百度webuploader 分片文件上传java服务器端(spring mvc)示例的优化

    最近项目上用到文件分片上传,于是找到了百度的一个开源前端控件webuploader. 于是尝试使用. 下载下来后,它提供的服务器端示例代码是php版的,那么Java版的呢? 其实,上传文件都是按照rf ...

  9. .net 实现上传文件分割,断点续传上传文件

    一 介绍 断点续传搜索大部分都是下载的断点续传,涉及到HTTP协议1.1的Range和Content-Range头. 来个简单的介绍 所谓断点续传,也就是要从文件已经下载的地方开始继续下载.在以前版本 ...

  10. ftp上传java代码

    <欢迎转载http://www.cnblogs.com/shizhongtao/p/3345826.html> 上传代码就写个简单的小例子.首先要加入jar包.commons-net-1. ...

随机推荐

  1. 23. 从零用Rust编写正反向代理,流控小姐姐的温柔一刀!

    wmproxy wmproxy已用Rust实现http/https代理, socks5代理, 反向代理, 静态文件服务器,四层TCP/UDP转发,内网穿透,后续将实现websocket代理等,会将实现 ...

  2. 如何使用Python将PDF转为Excel

    PDF文件是一种静态文档格式,通常难以编辑,而Excel则是一个灵活的表格工具.如果你需要处理PDF表格中的数据,那么将其导出为Excel文件可以大大节省工作时间和精力.Excel提供的强大数据编辑和 ...

  3. Redis 哨兵模式的原理及其搭建

    1.Redis哨兵 Redis提供了哨兵(Sentinel)机制来实现主从集群的自动故障恢复. 1.1.哨兵原理 1.1.1.集群结构和作用 哨兵的结构如图: 哨兵的作用如下: 监控:Sentinel ...

  4. Python 哈希表的实现——字典

    哈喽大家好,我是咸鱼 接触过 Python 的小伙伴应该对[字典]这一数据类型都了解吧 虽然 Python 没有显式名称为"哈希表"的内置数据结构,但是字典是哈希表实现的数据结构 ...

  5. Linux 运维人员最常用 150+命令汇总

    版权声明:原创作品,谢绝转载!否则将追究法律责任. ----- 作者:kirin 目录 版权声明:原创作品,谢绝转载!否则将追究法律责任. ----- 作者:kirin 命令帮助手册1 命令帮助手册2 ...

  6. NCTF2022-Crypto WP

    superecc 题目 from Crypto.Util.number import * from secrets import INF, flag assert flag[:5] == b'nctf ...

  7. 最新版本——Hadoop3.3.6单机版完全部署指南

    大家好,我是独孤风,大数据流动的作者. 本文基于最新的 Hadoop 3.3.6 的版本编写,带大家通过单机版充分了解 Apache Hadoop 的使用.本文更强调实践,实践是大数据学习的重要环节, ...

  8. MacOS Monterey 配置 PHP 环境记录

    目前 中文网中对于 MacOS 下安装 PHP 教程比较老,并且我个人感觉很难看懂.我在安装 PHP 过程中遇到了很多网络中没有出现过的问题,特此环境配置过程记录如下. 电脑:MacBook Pro ...

  9. MySQL笔记01: MySQL入门_1.1 MySQL概述

    1.1 MySQL概述 MySQL是一个关系数据库管理系统(Relational DataBase Management System,RDBMS).它是一个程序,可以存储大量的种类繁多的数据,并且提 ...

  10. 面向对象(OOP)

    面向对象 面向对象 面向过程 & 面向对象 面向过程思想 步骤清晰简单,第一步做什么,第二步做什么... 面对过程适合处理一些较为简单问题 面向对象思想 物以类聚,分类的思维模式,思考问题首先 ...