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);
	}

}

项目结构图:

运行: