1.前端
<form action="${pageContext.request.contextPath}/upload" method="post"
enctype="multipart/form-data">
<input type="file" name="image">
<input type="submit" value="上传"/>
</form>
2.依赖
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
3.文件上传的两种方式:
1.基于I/O流读入写出
2.文件上传后被封装在CommonsMultipartFile对象file中,从file获取文件名,创建存储路径,使用TransferTo(parent,child)直接转存文件。parent指父路径,child指要存储的文件。
@Controller
public class FileController {
@ResponseBody
@RequestMapping("/test")
public String test(){
return "成功";
}
@RequestMapping("/upload")//将name等于file的控件得到的文件封装成CommonsMultipartFile对象
public String upload(@RequestParam("image") CommonsMultipartFile file, HttpServletRequest request) {
String filename = file.getOriginalFilename();
if("".equals(filename)){
return "redirect:index.jsp";
}
filename = UUID.randomUUID().toString().substring(0, 12) + "_" + filename;
//设置上传文件保存位置
String path = request.getSession().getServletContext().getRealPath("/upload/images");
//如果路径不存在,创建一个,防止报错
File realpath = new File(path);
if(!realpath.exists()){
realpath.mkdirs();
}
try {
file.transferTo(new File(realpath,filename));
} catch (IOException e) {
e.printStackTrace();
}
/*
//文件输入流
InputStream in = null;
OutputStream out = null;
try {
in = file.getInputStream();
out = new FileOutputStream(new File(realpath,filename));
//读取写出
int len;
byte[] buffer = new byte[1024];
while((len = in.read(buffer)) != -1){
out.write(buffer,0,len);
out.flush();
}
} catch (IOException e) {
e.printStackTrace();
return "上传失败";
}finally {
try {
assert out != null;
out.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
*/
return "上传成功!";
}
}
4.文件下载
基于I/O流实现文件的下载
@ResponseBody
@RequestMapping("/download")
public String download(HttpServletRequest request,HttpServletResponse response){
String path = request.getSession().getServletContext().getRealPath("/upload/images");
String filename = "c6d6b06f-493_1.jpg";
response.reset();
response.setCharacterEncoding("UTF-8");
response.setContentType("multipart/form-data");
try {
response.setHeader("Content-Disposition","attachment;fileName=" + URLEncoder.encode(filename,"utf-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
return "下载失败";
}
File file = new File(path,filename);
InputStream in = null;
OutputStream out = null;
try {
in = new FileInputStream(file);
out = response.getOutputStream();
byte[] buffer = new byte[1024];
int len;
while((len = in.read(buffer)) != -1){
out.write(buffer,0,len);
out.flush();
}
} catch (IOException e) {
e.printStackTrace();
return "下载失败";
}finally {
try {
if (out != null) {
out.close();
}
} catch (IOException e) {
e.printStackTrace();
}
try {
if (in != null) {
in.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return "下载成功";
}
使用@RestController返回Json乱码配置
<!--json乱码配置-->
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<constructor-arg name="defaultCharset" value="UTF-8"/>
</bean>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="objectMapper">
<bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
<property name="failOnEmptyBeans" value="false"/>
</bean>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>