文件上传配置:

<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上传文件遇到重复读取InputStream的问题的更多相关文章

  1. SpringMVC上传文件(图片)并保存到本地

    SpringMVC上传文件(图片)并保存到本地 小记一波~ 基本的MVC配置就不展示了,这里给出核心代码 在spring-mvc的配置文件中写入如下配置 <bean id="multi ...

  2. springmvc上传文件,抄别人的

    SpringMVC中的文件上传 分类: SpringMVC 2012-05-17 12:55 26426人阅读 评论(13) 收藏 举报 stringuserinputclassencoding 这是 ...

  3. 2. SpringMVC 上传文件操作

    1.创建java web项目:SpringMVCUploadDownFile 2.在项目的WebRoot下的WEB-INF的lib包下添加如下jar文件 com.springsource.com.mc ...

  4. 使用springMVC上传文件

    control层实现功能: @RequestMapping(value="upload2") public String upLoad2(HttpServletRequest re ...

  5. SpringMVC上传文件总结

    如果是maven项目 需要在pom.xml文件里面引入下面两个jar包 <dependency> <groupId>commons-fileupload</groupId ...

  6. SpringMVC 上传文件 MultipartFile 转为 File

    在使用 SpringMVC 上传文件时,接收到的文件格式为 MultipartFile,但是在很多场景下使用都需要File格式的文件,记录下以便日后使用. 以下mFile为MultipartFile文 ...

  7. springmvc 上传文件时的错误

    使用springmvc上传文件一直失败,文件参数一直为null, 原来是配置文件没写成功. <bean id="multipartResolver" class=" ...

  8. springMvc上传文件、读取zip/rar文件

    参考文章: http://www.cnblogs.com/interdrp/p/6734033.html 方法一: 1)没有配置org.springframework.web.multipart.co ...

  9. SpringMVC上传文件的三种方式(转)

    直接上代码吧,大伙一看便知 这时:commonsmultipartresolver 的源码,可以研究一下 http://www.verysource.com/code/2337329_1/common ...

随机推荐

  1. C# Socket通信改进记录

    1. Socket 使用原始Socket,Send和Recv方法 进行发送和消息获取.(另起后台线程 不停获取和发送) public void RecvMsg() { //receive messag ...

  2. MVC中的Controllers和View分别放到单独的项目中

    将Controllers放到独立项目中: 第一步:创建Mvc.Controllers,Mvc.Models和UI三个项目 Mvc.Controllers用来编写Controllers Mvc.Mode ...

  3. Socket网络通讯

    网络编程 使用C#进行网络编程时,通常都需要用到System.Net命名空间.System.Net.Sockets命名空间和System.Net.Mail命名空间: 1. System.Net命名空间 ...

  4. python3好用的requests库

    python3好用的requests库 requests是什么? requests是基于urllib编写的http库,支持python3,比urllib更好用,更简单.之前使用python写一些htt ...

  5. kali linux之手动漏洞挖掘三(sql注入)

    服务器端程序将用户输入作为参数作为查询条件,直接拼写sql语句,并将结果返回给客户端浏览器 如判断登录 select * from users where user='uname' and passw ...

  6. scrapy 调试功能

    在使用 scrapy 来爬取网页的时候,我们难免会使用到调试功能,下面介绍两种调试方法: 1.终端使用 scrapy shell exampleurl exampleurl 为你要爬取网站的 url ...

  7. iframe里面的元素触发父窗口元素事件的jquery代码 转

    例如父窗口定义了一个事件. top: $(dom1).bind('topEvent', function(){}); 那么iframe里面的元素怎样触发父窗口dom1的事件呢?这样吗? $(dom1, ...

  8. iOS开发时间戳与时间NSDate,时区的转换,汉字与UTF8,16进制的转换

    http://blog.sina.com.cn/s/blog_68661bd80101njdo.html 标签: ios时间戳 ios开发时间戳 ios16进制转中文 ios开发utf8转中文 ios ...

  9. Django--队列2

    celery 4.2 -Ofair现在是默认的调度策略 关于-Ofair命令行选项的作用存在很多混淆,并且在解释中使用术语“预取”可能没有帮助,因为这个术语在AMQP中有多么混乱. 当使用prefor ...

  10. 【语义分割】PSPNet中PSP模块的pytorch实现

    github地址:https://github.com/Lextal/pspnet-pytorch/blob/master/pspnet.py PSP模块示意图如下 代码如下 class PSPMod ...