文件上传配置:

<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的问题相关推荐

  1. SpringMVC上传文件出现400 Bad Request错误

    1.起因 写了上传文件代码,用postman测试一下报400 Dad Request. 2.原因 看了下资料了解到使用SpringMVC上传文件需要在form表单中添加enctype="mu ...

  2. SpringMVC上传文件

    首先自我介绍一下,我是王登高,下面是我的头像: 是不是很帅,我每天照镜子都感觉自己帅. 好了不扯这些没用的,我们进入正题:前两天,自己边学边做遇到的SpringMVC上传文件的问题,用户可以上传图片, ...

  3. SpringMVC上传文件的三种方式

    /** 通过流的方式上传文件* @RequestParam("file") 将name=file控件得到的文件封装成CommonsMultipartFile 对象*/@Reques ...

  4. SpringMVC上传文件配置

    方式一:将multipartResolver中的属性分别单独配置(推荐) <!-- SpringMVC文件上传 --><bean id="multipartResolver ...

  5. form表单上传文件_SpringBoot中如何使用SpringMVC上传文件?

    今天我们要说的这个话题很简单,不要问为啥,因为SpringBoot,哈哈.现在SpringBoot可以说人人都会用了,它的好处是显而易见的,大大的简化了配置,一起来看看吧. 我们分以下3种情况来谈这个 ...

  6. SpringMVC 上传文件and过滤器

    SpringMVC提供了一个MultipartResolver接口用来实现文件上传,并使用Commons FileUpload技术实现了一个该接口的实现类CommonsMultipartResolve ...

  7. 百度 UEditor--自定义上传文件路径及读取文件

    jsp中替换掉上传和预览图片的URL 注意第一句判断,注意要用项目的相对URL return '/sirdifoa/kentra/file/uploadImage.do'; 1 2 3 4 5 6 7 ...

  8. SpringMVC上传文件解析request请求为空获取不到数据问题

    2019独角兽企业重金招聘Python工程师标准>>> 一.原因分析 首先我们来看下Spring mvc 中文件上传的配置 <bean id="multipartRe ...

  9. SpringMVC上传文件以流方式判断类型附常用类型

    1 // 此类中判断类型所截取的byte 长度暂不确定,请使用者测试过使用 2 package com.tg.common.other; 3 4 import com.tg.common.tginte ...

  10. antd-vue上传文件,并读取文件内容

    需求:antd-vue 点击上传wsdl文件,先读取wsdl文件中的内容进行展示. 上传使用 a-upload 组件 vue页面代码 <a-form :form="form" ...

最新文章

  1. ajax invoke error,配置全局的异常捕获时,走ajax请求下面报错
  2. 综述|基于深度学习方式的场景分类算法
  3. Latex中的列表环境[一]
  4. ffmpeg 命令_Qt音视频开发11-ffmpeg常用命令
  5. 百练OJ:2746:约瑟夫问题
  6. 04.卷积神经网络 W3.目标检测(作业:自动驾驶 - 汽车检测)
  7. ant编译web项目
  8. Abaqus帮助文档翻译——启动和退出Abaqus/CAE
  9. Vue 下载本地静态资源static文件夹
  10. 数学分析教程 第十八章学习感受
  11. OPNsense用户手册-用户界面
  12. SLAM | 视觉SLAM中直接法开源算法:LSD-SLAM、DSO
  13. 微信商家转账到零钱 V3(JAVA)转账与查询
  14. PIXHAWK上安装PX4Flow光流传感器及调试过程
  15. 一台电脑如何同时登录两个skype帐号
  16. 国际短信系统平台后台功能详解-移讯云短信软件
  17. JavaScript使用事件onclick导致css样式失效问题
  18. C++学习(三十九)(C语言部分)之 游戏项目(2048游戏)
  19. 百度android 升级,百度浏览器app下载_百度浏览器v6.4.21安卓去广告去升级版-这家软件站...
  20. c51语言提供了code存储类型来访问,C51数据类型和存储空间

热门文章

  1. R Markdown与RStudio IDE深度结合
  2. [转帖]golang操作mysql使用总结
  3. Java:单例模式的七种写法 (转)
  4. LeetCode Repeated DNA Sequences
  5. 我们通过一个服务器程序,以研究backlog参数对listen系统调用的影响,运行截图如下...
  6. 链队列基本运算的实现
  7. 项目是如何完成的(一)
  8. StreamSets sdc rpc 测试
  9. 手摸手教你git配置ssh
  10. 三星 NAND 存储器新厂施工顺遂,上半年有望如期投产