Java框架小技巧 之 SpringMVC的文件上传与下载

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的文件上传与下载就到此结束

好啦,这就是今天的所有内容,有什么疑问的可以在评论提出
觉得这篇文章有帮助的朋友,可以点个赞,你的支持,就是我写的动力,谢谢大家!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值