SpringMVC(4) 文件上传和下载

xiaoxiao2025-11-10  6

点击下载项目资源        密码: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); } }

项目结构图:

运行:

转载请注明原文地址: https://www.6miu.com/read-5039400.html

最新回复(0)