SpringMVC(4) 文件上传和下载
点击下载项目资源 密码:1k9z
前端页面:
上传文件注意事项:①post提交数据
②form表单 --> enctype属性为:multipart/form-data
③使用上传文件的file标签
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>文件上传</h1>
<form action="/zq/upload" method="post" enctype="multipart/form-data" >
用户名:<input type="text" name="username" ><br/>
文件上传:<input type="file" name="image" ><br/>
<input type="submit" ><br/>
</form>
<h1>文件下载</h1>
<a href="/zq/download?filename=1.jpg">下载</a>
<a href="/zq/download2?filename=1.jpg">下载2</a>
</body>
</html>
上传文件功能类:
/**
* 上传文件:
* 使用MultipartFile类型接收前台上传的文件数据
* 接收数据时要指定接收方式-->RequestMethod.POST
* @author 郑清
*/
@Controller
public class UploadController {
@RequestMapping(value="/upload",method=RequestMethod.POST)
@ResponseBody //不写会默认返回当前路径!!
public void upload(String username,MultipartFile image,HttpServletRequest req) throws Exception, IOException{
System.out.println("username数据:"+username);
//接收文件数据
System.out.println(image.getContentType());// image/jpeg 获取上传文件的类型
System.out.println(image.getName());//image 获取file标签的name属性 <input type="file" name="image" >
System.out.println(image.getOriginalFilename());//1.jpg 获取上传文件的名称
//获取到上传的文件数据
String contentType = image.getContentType();
//判断上传文件是否为图片
if (contentType==null||!contentType.startsWith("image/")) {
System.out.println("===不属于图片类型...===");
return;
}
//动态获取上传文件夹的路径
ServletContext context = req.getServletContext();
String realPath = context.getRealPath("/upload");//获取本地存储位置的绝对路径
String filename = image.getOriginalFilename();//获取上传时的文件名称
filename = UUID.randomUUID().toString()+"."+FilenameUtils.getExtension(filename);//创建一个新的文件名称 getExtension(name):获取文件后缀名
File f= new File(realPath, filename);
image.transferTo(f);//将上传的文件存储到指定位置
}
}
注意:需要在springmvc的配置文件中配置上传文件的解释器
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize">
<value>10000000000</value> <!-- 以字节byte为单位 -->
</property>
<property name="defaultEncoding">
<value>UTF-8</value>
</property>
</bean>
下载功能类:
/**
* 文件下载:
* @author 郑清
*/
@Controller
public class DownLoadController {
/*
* 下载方式一:
* ①获取前台要下载的文件名称
* ②设置响应类型
* ③设置下载页显示的文件名
* ④获取下载文件夹的绝对路径和文件名合并为File类型
* ⑤将文件复制到浏览器
*/
@RequestMapping("/download")
@ResponseBody
public void download(HttpServletRequest req, HttpServletResponse resp, String filename) throws Exception {
String realPath = req.getServletContext().getRealPath("/download");//获取下载文件的路径
File file = new File(realPath, filename);//把下载文件构成一个文件处理 filename:前台传过来的文件名称
//设置响应类型 ==》 告诉浏览器当前是下载操作,我要下载东西
resp.setContentType("application/x-msdownload");
//设置下载时文件的显示类型(即文件名称-后缀) ex:txt为文本类型
resp.setHeader("Content-Disposition", "attachment;filename=" + filename);
//下载文件:将一个路径下的文件数据转到一个输出流中,也就是把服务器文件通过流写(复制)到浏览器端
Files.copy(file.toPath(), resp.getOutputStream());//Files.copy(要下载的文件的路径,响应的输出流)
}
/*
* 下载方式二:Spring框架技术
*/
@RequestMapping(value = "/download2", method = RequestMethod.GET)
public ResponseEntity<byte[]> download(HttpServletRequest request,String filename) throws IOException {
String realPath = request.getServletContext().getRealPath("/download");//获取下载文件的路径
File file = new File(realPath, filename);//把下载文件构成一个文件处理 filename:前台传过来的文件名称
HttpHeaders headers = new HttpHeaders();//设置头信息
String downloadFileName = new String(filename.getBytes("UTF-8"), "iso-8859-1");//设置响应的文件名
headers.setContentDispositionFormData("attachment", downloadFileName);
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
// MediaType:互联网媒介类型 contentType:具体请求中的媒体类型信息
return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file), headers, HttpStatus.CREATED);
}
}
项目结构图:

运行:
