SpringMVC的文件上传与下载
今天的这篇文章就来说说我们SpringMVC的文件上传与下载,我看了许多篇文章以后,决定也自己写一篇,因为有些关于文件上传的文章,没说的太过清楚,也有些误区。
SpringMVC的文件上传
首先我们先做好准备工作
1.准备需要用到的jar包
Apache下的commons的io与fileupload这两个jar包
这里顺便就给大家准备了下载地址
commons.io:commons-io下载
点开链接就会看到这个界面,这个版本是目前最新的也是支持JDK1.7版本后的
Binaries就是我们需要的jar包的下载
而source就是对应的源码
commons.fileupdate:commons-fileupload下载
大家会看到很多个版本
我们挑不要太新的就可以了,然后点here进去就会看到下面这个页面
跟上面的commons-io一样的页面
点击我们需要的资源下载即可
2.配置对应的配置
我们需要的jar包准备好之后就可以配置我们的SpringMVC的配置文件了
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 默认编码 -->
<property name="DefaultEncoding" value="UTF-8" />
<!-- 允许上传的最大大小 单位是字节bit -->
<property name="MaxUploadSize" value="1048576" />
</bean>
把以上的代码复制贴贴到我们的配置文件里就可以了
3.写我们的前端代码
<form action="test.naiy" method="post" enctype="multipart/form-data">
<input type="text" name="test" />
<input type="file" name="sourse" >
<input type="submit" value="test" />
</form>
这里就是我们的前端代码了
这里有两个我们需要注意的地方
3.1 form里必须配置enctype=“multipart/form-data”
因为我们都知道文件的传输是字节,这里设置就是让服务器知道,我们要传字节
3.2 上传文件input的type为file
4.编写我们的Controller类
@RequestMapping(value = "/test.naiy", method = RequestMethod.POST)
public void test(String test, @RequestParam MultipartFile sourse)
throws IOException {
String fileName = sourse.getOriginalFilename();
// 文件名
System.out.println(fileName);
// 文件大小
System.out.println(sourse.getSize());
// 上传操作
// 上传到的地方
String savaPath = "E://file";
File savaFile = new File(savaPath);
// 如果不存在该目录就创建
if (!savaFile.exists()) {
savaFile.mkdir();
}
// 将我们的图片移动到指定位置
sourse.transferTo(new File(savaFile + "/" + fileName));
}
这里需要注意的一个地方是
我们方法入参“MultipartFile sourse”这个参数前面必须加上 @RequestParam
否则就会报错
报的错如下
org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.web.multipart.MultipartFile]: Specified class is an interface
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:101)
at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolveModelAttribute(HandlerMethodInvoker.java:776)
at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolveHandlerArguments(HandlerMethodInvoker.java:369)
at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:173)
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:444)
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:432)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:968)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:870)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:660)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:844)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:528)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:678)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:798)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:810)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1500)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)
这个异常跟我们说的是MultipartFile 这个接口不可实例化,我们都知道接口是不可以实例化的
所以这里就会抛出这个异常,所以大家需要注意一下
好了,上面就是我们的文件上传,下面就是文件下载
SpringMVC的文件下载
文件下载的话,相对于我们的上传简单的许多,就是构造我们的响应头就可以了
下面会讲两种方式
我们首先先来编写我们的前台代码
<a href="download.naiy?filename=1.png">点击下载</a>
<a href="download2.naiy?filename=1.png">点击下载2</a>
1.非SpringMVC方式
代码如下:
@RequestMapping("/download.naiy")
@ResponseBody
public void download(HttpServletRequest req, HttpServletResponse resp, String filename) throws IOException {
// 获取下载文件的路径
String realPath = "E://file";
// 把我们的下载路径与文件名合在一起 也就是E://file/1.png
File file = new File(realPath, filename);
// 设置响应头 告诉浏览器当前是下载操作,我们要下载东西
resp.setContentType("application/x-msdownload");
// 设置下载时文件的显示类型(文件名称加后缀) 例如1.png
resp.setHeader("Content-Disposition", "attachment;filename=" + filename);
// 利用文件复制,将我们的文件复制到响应头的输出流中
Files.copy(file.toPath(), resp.getOutputStream());
}
2.SpringMVC方式
代码如下:
@RequestMapping(value = "/download2.naiy", method = RequestMethod.GET)
public ResponseEntity<byte[]> download(HttpServletRequest request, String filename) throws IOException {
// 获取下载文件的路径
String realPath = "E://file";
// 把我们的下载路径与文件名合在一起 也就是E://file/1.png
File file = new File(realPath, filename);
//设置我们的响应头
HttpHeaders headers = new HttpHeaders();
String downloadFileName = new String(filename.getBytes("UTF-8"), "iso-8859-1");
//设置下载时文件的显示类型(文件名称加后缀) 例如1.png
headers.setContentDispositionFormData("attachment", downloadFileName);
//告诉浏览器当前是下载操作,我们要下载东西
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
//封装的内容 文件的字节 响应头 响应码
return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file), headers, HttpStatus.CREATED);
}
以上就是我们两种下载方式
至此我们的SpringMVC的文件上传与下载就到此结束
好啦,这就是今天的所有内容,有什么疑问的可以在评论提出
觉得这篇文章有帮助的朋友,可以点个赞,你的支持,就是我写的动力,谢谢大家!!!