SpringMvc上传文件遇到重复读取InputStream的问题
文件上传配置:
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"><property name="defaultEncoding" value="utf-8"></property><property name="maxUploadSize" value="10485760000"></property><property name="maxInMemorySize" value="40960"></property>
</bean>
Controller代码
@RequestMapping("/file")
@RestController
public class HelloController {@Autowiredprivate UploadService uploadService;@RequestMapping(value="/upload", method= RequestMethod.POST)public void upload(@RequestParam(value = "file", required = true) MultipartFile file) {String md5 = DigestUtils.md5Hex(file.getInputStream()); //使用commons-codec计算md5uploadService.upload(file.getInputStream());}
}
单元测试代码
@ContextConfiguration(locations = "classpath*:META-INF/spring/spring-*.xml")
@RunWith(SpringJUnit4ClassRunner.class)
public class UploadServiceTests extends BaseTests {private static final Logger logger = LoggerFactory.getLogger(UploadServiceTests.class);@Autowiredprivate UploadService uploadService;@Testpublic void upload() throws Exception {Integer num = new Random().nextInt(9999999);byte[] bytes = ("HelloWorld-" + num).getBytes();InputStream inputStream = new ByteArrayInputStream(bytes);String md5 = MD5Utils.getMD5(inputStream);uploadService.upload(inputStream);}
}
遇到问题:
Controller代码可以正常上传,而单元测试代码上传只有0字节
原因:
在计算stream的md5时,已经将流的游标移动到了最后,如果不做任何处理直接使用,则无法再从流里读到字节。而Controller里的file.getInputStream()实际每次返回的并不是同一个流,也就是计算md5和传给upload方法的并不是同一个stream,所以Controller里的upload成功的取到了数据。单元测试的stream时手动创建的,计算md5和upload的都是同一个流,所以upload时流的游标已经在尾部了。
修改单元测试代码为:
InputStream inputStream = new ByteArrayInputStream(bytes);
inputStream.mark(0);
String md5 = MD5Utils.getMD5(inputStream);
inputStream.reset();
关于mark和reset的理解,可以参考通过mark和reset方法重复利用InputStream
转载于:https://www.cnblogs.com/liqipeng/p/7452685.html
SpringMvc上传文件遇到重复读取InputStream的问题相关推荐
- SpringMVC上传文件出现400 Bad Request错误
1.起因 写了上传文件代码,用postman测试一下报400 Dad Request. 2.原因 看了下资料了解到使用SpringMVC上传文件需要在form表单中添加enctype="mu ...
- SpringMVC上传文件
首先自我介绍一下,我是王登高,下面是我的头像: 是不是很帅,我每天照镜子都感觉自己帅. 好了不扯这些没用的,我们进入正题:前两天,自己边学边做遇到的SpringMVC上传文件的问题,用户可以上传图片, ...
- SpringMVC上传文件的三种方式
/** 通过流的方式上传文件* @RequestParam("file") 将name=file控件得到的文件封装成CommonsMultipartFile 对象*/@Reques ...
- SpringMVC上传文件配置
方式一:将multipartResolver中的属性分别单独配置(推荐) <!-- SpringMVC文件上传 --><bean id="multipartResolver ...
- form表单上传文件_SpringBoot中如何使用SpringMVC上传文件?
今天我们要说的这个话题很简单,不要问为啥,因为SpringBoot,哈哈.现在SpringBoot可以说人人都会用了,它的好处是显而易见的,大大的简化了配置,一起来看看吧. 我们分以下3种情况来谈这个 ...
- SpringMVC 上传文件and过滤器
SpringMVC提供了一个MultipartResolver接口用来实现文件上传,并使用Commons FileUpload技术实现了一个该接口的实现类CommonsMultipartResolve ...
- 百度 UEditor--自定义上传文件路径及读取文件
jsp中替换掉上传和预览图片的URL 注意第一句判断,注意要用项目的相对URL return '/sirdifoa/kentra/file/uploadImage.do'; 1 2 3 4 5 6 7 ...
- SpringMVC上传文件解析request请求为空获取不到数据问题
2019独角兽企业重金招聘Python工程师标准>>> 一.原因分析 首先我们来看下Spring mvc 中文件上传的配置 <bean id="multipartRe ...
- SpringMVC上传文件以流方式判断类型附常用类型
1 // 此类中判断类型所截取的byte 长度暂不确定,请使用者测试过使用 2 package com.tg.common.other; 3 4 import com.tg.common.tginte ...
- antd-vue上传文件,并读取文件内容
需求:antd-vue 点击上传wsdl文件,先读取wsdl文件中的内容进行展示. 上传使用 a-upload 组件 vue页面代码 <a-form :form="form" ...
最新文章
- ajax invoke error,配置全局的异常捕获时,走ajax请求下面报错
- 综述|基于深度学习方式的场景分类算法
- Latex中的列表环境[一]
- ffmpeg 命令_Qt音视频开发11-ffmpeg常用命令
- 百练OJ:2746:约瑟夫问题
- 04.卷积神经网络 W3.目标检测(作业:自动驾驶 - 汽车检测)
- ant编译web项目
- Abaqus帮助文档翻译——启动和退出Abaqus/CAE
- Vue 下载本地静态资源static文件夹
- 数学分析教程 第十八章学习感受
- OPNsense用户手册-用户界面
- SLAM | 视觉SLAM中直接法开源算法:LSD-SLAM、DSO
- 微信商家转账到零钱 V3(JAVA)转账与查询
- PIXHAWK上安装PX4Flow光流传感器及调试过程
- 一台电脑如何同时登录两个skype帐号
- 国际短信系统平台后台功能详解-移讯云短信软件
- JavaScript使用事件onclick导致css样式失效问题
- C++学习(三十九)(C语言部分)之 游戏项目(2048游戏)
- 百度android 升级,百度浏览器app下载_百度浏览器v6.4.21安卓去广告去升级版-这家软件站...
- c51语言提供了code存储类型来访问,C51数据类型和存储空间