SpringMvc上传文件遇到重复读取InputStream的问题
2017-09-03 17:18
579 查看
文件上传配置:
Controller代码
单元测试代码
遇到问题:
Controller代码可以正常上传,而单元测试代码上传只有0字节
原因:
在计算stream的md5时,已经将流的游标移动到了最后,如果不做任何处理直接使用,则无法再从流里读到字节。而Controller里的file.getInputStream()实际每次返回的并不是同一个流,也就是计算md5和传给upload方法的并不是同一个stream,所以Controller里的upload成功的取到了数据。单元测试的stream时手动创建的,计算md5和upload的都是同一个流,所以upload时流的游标已经在尾部了。
修改单元测试代码为:
关于mark和reset的理解,可以参考通过mark和reset方法重复利用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 { @Autowired private 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计算md5 uploadService.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); @Autowired private UploadService uploadService; @Test public 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
相关文章推荐
- SpringMVC(tomcat)文件上传(MultipartFile)遇到的一些问题及解决
- SpringMVC上传文件遇到的问题
- java中springMVC文件上传遇到的问题
- 转:关于我使用spring mvc框架做文件上传时遇到的问题
- 开发文件上传下载所遇到的问题
- php 的文件操作,上传,中常遇到的问题
- Grails 文件上传遇到的问题
- PHP file函数读取文件遇到<***>时的奇怪问题
- win7 web开发遇到的问题-由于权限不足而无法读取配置文件,无法访问请求的页面
- request.getInputStream()读取post传递的xml文件问题
- Flex结合ASP 实现文件上传遇到的问题(学习笔记)
- Inputstream读取文件,使用read()方法,判断尾标记需要注意的问题
- BMP文件读取遇到的问题
- 关于我使用spring mvc框架做文件上传时遇到的问题
- 文件(附件)上传的几种方法(含自建目录,防止文件名重复等问题)
- IE8上传文件时读取文件的本地路径的问题
- 于Excel文件上传读取数据的问题
- IE8上传文件时javascript读取文件的本地路径的问题("C:/fakepath/")的解决方案
- 用C/C++写上传文件的CGI,遇到问题
- 在用POI读取EXCEL文件时遇到的问题