近期复习整理文件的上传下载流程。
主要流程:
1、在pom.xml文件中添加实现文件上传和下载的依赖。
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.3</version>
</dependency>
2、在Springmvc-config.xml文件中,添加支持文件上传的类,具体代码如下:
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="10485760"></property>
<property name="defaultEncoding" value="utf-8"></property>
</bean>
其中id 必须要有,<property>有以下几种,按需设置就可以了:
一、文件的上传
1、文件上传的<form>表单:
<form action="/admin/register" method="post" enctype="multipart/form-data">
<label>头像</label>
<input type="file" name="userHeader">
<label>账户:</label>
<input type="text" name="account" id="account">
<label>密码:</label>
<input type="password" name="password" id="password">
<label>生日:</label>
<input type="Date" name="birthday" id="birthday">
<label>性别</label>
<input name ="sex" type="radio" value="男">男<input name ="sex" type="radio" value="女">女
<label>邮箱:</label>
<input type="text" name="email" id="email">
<button type="submit" id="tijiao" >提交</button>
需要注意的就是必须添加enctype="multipart/form-data"
input 的类型是file。
2、上传文件controller的写法。
@RequestMapping(value = "/register", method = RequestMethod.POST)
public String register(@Validated User user ,Errors errors,@RequestParam("userHeader") MultipartFile userHeader,
Model model, HttpServletRequest request,
HttpServletResponse response
) {
if (errors.hasErrors()) {
for (ObjectError objectError : errors.getAllErrors()) {
System.out.print(objectError.getDefaultMessage());
}
model.addAttribute("error", errors.getAllErrors().get(0).getDefaultMessage());
return "register";
}
if (userHeader != null && !userHeader.isEmpty()) {
String filePath = request.getServletContext().getRealPath("/image");
String fileName = userHeader.getOriginalFilename();
File file = new File(filePath + File.separator + fileName);//此时文件还在temp文件里
try {
userHeader.transferTo(file);
} catch (Exception e) {
e.printStackTrace();
}
}
user.setId(userList.size() + 1);
userList.add(user);
return "redirect:/login";
}
重点在if条件语句那一段,
if (userHeader != null && !userHeader.isEmpty()) { //获取你要存放图片的位置,需要在工程中新建一个image文件来存放图片。 String filePath = request.getServletContext().getRealPath("/image"); //获取到图片的名字 String fileName = userHeader.getOriginalFilename(); //创建一个目标路径和名字相同的文件 File file = new File(filePath + File.separator + fileName);//此时文件还在temp文件里 try { //将文件从临时文件夹中传到服务器的指定文件中。 userHeader.transferTo(file); } catch (Exception e) { e.printStackTrace(); } } 错误记录: 1、在上传的过程中,出现过400错误,400错误一般指的是请求数据的格式不对,通常情况下就是form表单的name 和pojo类中的 名字不对应,我的错误就是@validate这个注解和Errors分开了,
@Validated User user ,Errors errors,这两个一定连在一起,否则一定会报错。
2、image文件一定要建对地方,在target目录下也要新建一个image文件。目录结构如下,
![](https://i-blog.csdnimg.cn/blog_migrate/2c96120d1b1966dbee68bb78e0f7c5b9.png)
二、文件的下载
文件下载controller写法如下:
不理解@pathVariable可自行百度,该controller暂时只是实现在url输入 图片地址并下载,具体完善以后在补充,
@RequestMapping(value = "/downLoad/{imagename}/{type}" ) public ResponseEntity<byte[]> downLoad(@PathVariable String imagename, @PathVariable String type, HttpServletRequest request) throws Exception{ //获取到服务器中image文件的地址 String filepath = request.getServletContext().getRealPath("/image/"); //因为url不会识别“.”这个字符,所以自动加上 String fileFullName = imagename+"."+type; File newFile = new File(filepath+File.separator+fileFullName); HttpHeaders httpHeaders = new HttpHeaders(); httpHeaders.setContentDispositionFormData("attachment",fileFullName, Charset.forName("utf-8"));//防止中文乱码 httpHeaders.setContentType(MediaType.APPLICATION_OCTET_STREAM); return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(newFile),httpHeaders, HttpStatus.CREATED); } }
欲完善,待补充。