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. Vite 5.0有哪些新变化?

    Rollup 4 Vite 现在使用 Rollup 4,它也带来了一些重大的变化,特别是: 导入断言(assertions 属性)已被重命名为导入属性(attributes 属性). 不再支持 Aco ...

  2. 【教程】cpp转python Nanobind 实践 加速轻量版 pythonbind11

    主要是尝试一下把c++这边的函数封装打包给python用,选择nanobind的原因是:1. 优化速度快,2. 生成二进制包小,不过pythonbind11是更为广泛知道的,nanobind也是pyt ...

  3. 字节跳动AB实验经验分享:企业如何构建数据驱动的实验文化?

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 近日,CCF TF 举办了第 123 期分享活动,本期主题为"用户体验工程". CCF TF ...

  4. js实现在报表参数界面获取body中控件的值

    要在报表参数界面获取body中控件的值,你可以使用JavaScript来实现.下面是一个详细的介绍: 1. DOM(文档对象模型): - DOM是用于操作HTML文档的API,它允许你通过JavaSc ...

  5. 快速认识,前端必学编程语言:JavaScript

    JavaScript是构建Web应用必学的一门编程语言,也是最受开发者欢迎的热门语言之一.所以,如果您还不知道JavaScript的用处.特点的话,赶紧补充一下这块基础知识. JavaScript 是 ...

  6. Lucene和索引

    全文索引的原理: 是 扫描每个词 对每个词创建索引,指明这个词在文章出现的次数和位置 全文检索的流程:对 检索的对象(文章,文档,网页内容) 预先建立 文档域 和 索引域 ,在索引域会分词创建索引,然 ...

  7. [CF1229E]Marek and Matching

    This is a harder version of the problem. In this version, \(n \le 7\). Marek is working hard on crea ...

  8. 阿里云+智能ai+gpt

    1.阿里 百度 腾讯分词 知识库.     阿里云(项目具体的费用预算展示,实际功能核算.) 向量智库 https://developer.aliyun.com/article/1234278?spm ...

  9. Celery将任务分发到不同的队列,交给不同的Worker处理

    https://docs.celeryq.dev/en/stable/userguide/routing.html#routing-tasks https://blog.csdn.net/wangle ...

  10. 安卓之DocumentsProvider应用场景以及优劣分析

    文章摘要 本文深入探讨了安卓DocumentsProvider的应用场景,分析了其优势与不足,并提供了简单的代码实现.DocumentsProvider是安卓系统中用于文件存储与访问的关键组件,为应用 ...