配置文件中配置扫描包,以便创建各个类的bean对象
<context:component-scan base-package="com.neuedu.spring_mvc"></context:component-scan>
一、文件的上传
Spring MVC 上下文中默认没有为文件上传提供了直接的支持,因此默认情况下不能处理文件的上传工作
如果想使用 Spring 的文件上传功能,需现在上下文中配置 CommonsMultipartResovler:
1、加入jar包:
commons-fileupload-1.3.1.jar
commons-io-2.4.jar
Maven项目通过在pom.xml文件中配置jar包依赖
1 <dependency>
2 <groupId>commons-fileupload</groupId>
3 <artifactId>commons-fileupload</artifactId>
4 <version>1.3.1</version>
5 </dependency>
6 <dependency>
7 <groupId>commons-io</groupId>
8 <artifactId>commons-io</artifactId>
9 <version>2.4</version>
10 </dependency>
2、在SpringMVC配置文件中配置CommonsMultipartResovler
1 <!-- 配置CommonsMultipartResolver,必须配置id值为multipartResolver -->
2 <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
3 <property name="defaultEncoding" value="utf-8"></property>
4 <!-- 以字节为单位 -->
5 <property name="maxUploadSize" value="1024000"></property>
6 </bean>
3、表单的设置
POST请求,file类型,enctype="multipart/form-data"
1 <form action="${pageContext.request.contextPath}/upload" method="post" enctype="multipart/form-data">
2 文件:<input type="file" name="file"/>
3 描述:<input type="text" name="desc"/>
4 <input type="submit" value="上传"/>
5 </form>
4、上传的实现
1 @Controller
2 public class TestController {
3 @RequestMapping(value="/upload",method=RequestMethod.POST)
4 public String upload(@RequestParam(value="desc") String desc,
5 @RequestParam(value="file") CommonsMultipartFile file,HttpServletRequest request) throws IOException{
6 ServletContext context = request.getSession().getServletContext();
7 //获取真实路径,使用tomcat插件,默认路径为webapp下
8 String realPath = context.getRealPath("/upload");
9
10 //判断upload文件夹是否存在
11 File file1=new File(realPath);
12 if(!file1.exists()){
13 file1.mkdir();
14 }
15
16 //文件名添加uuid,防止重复
17 String uuid=UUID.randomUUID().toString().replace("-", "");
18 String fileName=uuid+"_"+file.getOriginalFilename();
19 //获取输入流
20 InputStream in=file.getInputStream();
21 //获取输出流,指定输出路径及文件名
22 FileOutputStream out=new FileOutputStream(new File(realPath+"\"+fileName));
23 IOUtils.copy(in, out);
24 out.close();
25 in.close();
26 return "success";
27 }
28 }
二、文件的下载
用ResponseEntity<byte[]> 返回值完成文件下载
1 @Controller
2 public class TestController {
3 @RequestMapping(value="/download")
4 public ResponseEntity<byte[]> download(HttpSession session) throws IOException{
5 byte[] body=null;
6 ServletContext context = session.getServletContext();
7 String fileName="d5b9b61dc7154f5c9df4c844348ef6df_fennu.jpg";
8
9 //获取文件路径
10 String filePath = context.getRealPath("/upload/"+fileName);
11 //读取文件内容
12 InputStream in=new FileInputStream(new File(filePath));
13 //创建文件字节数组,数组长度为文件的总大小
14 body=new byte[in.available()];
15 //将文件内容保存到字节数组中
16 in.read(body);
17
18 //创建响应头信息的MultiValueMap
19 MultiValueMap<String, String> headers=new HttpHeaders();
20 //设置文件名重新编码,以gbk格式读取再编码为iso8859-1
21 fileName=new String(fileName.getBytes("gbk"), "iso8859-1");
22 //设置响应信息
23 headers.add("Content-Disposition", "attachment;filename="+fileName);
24
25 HttpStatus statusCode=HttpStatus.OK;
26 ResponseEntity<byte[]> responseEntity=new ResponseEntity<byte[]>(body, headers, statusCode);
27 in.close();
28 return responseEntity;
29 }
30 }