需求:再web项目中,可能会出现需要上传文件,如用户注册上传头像,上传照片,或其他资源等
springmvc实现文件上传:
1.导入jar包:
2设置表单:
<!--当表单中存在文件上传时,需要再form表单中添加enctype="multipart/form-data"属性,而且提交方式必须为post请求,不然上传图片等会报错--> <form action="../file" method="post" enctype="multipart/form-data"> <input type="file" name="img"> <input type="submit"> </form>
3.设置文件上传视图解析器:
<!--配置文件上传视图解析器--> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!--设置编码格式--> <property name="defaultEncoding" value="utf-8"/> <!--设置文件最大的大小10M--> <property name="maxInMemorySize" value="#{10*1024*1024}"/> </bean>
4.上传功能后台:
@Controller public class FileController { /*@RequestParam("img) 将前端请求中指定name的数据放入参数中*/ @RequestMapping("/file") public String file(@RequestParam("img") MultipartFile file, HttpServletRequest request) { // 获取原始文件名 String trueName = file.getOriginalFilename(); // 设置文件保存的路径:当前项目的下的/static/upload/文件夹下;因为运行时是编译后的文件再tomcat服务器中运行, // 因此查看是否上传成功需要再class文件中查看 String path = request.getSession().getServletContext().getRealPath("/static/upload/"); // 设置上传文件保存本地的文件名及路径 File file1 = new File(path + trueName); // 判断当前文件父级文件夹是否存在,如果不存在,就创建文件夹 if (!file1.getParentFile().exists()) { file1.mkdirs(); } try { // 上传文件,核心功能 file.transferTo(file1); } catch (IOException e) { e.printStackTrace(); } return "index"; } }
一个最简单的上传功能就完成了,不过这种方式并不好,因为如果有多人操作,出现上传文件名相同等问题,会覆盖,因此要生成一个不会重复的文件名:
1.使用时间来设置文件名:
上传后保存路径:
2.使用UUID类:
其他的内容都一样,生成文件名如下:
文件的下载:
1.可以直接前端设置a标签连接文件地址:
右击链接另存就可以下载了;
2.写一个后台控制器:
package com.zs.controller; import com.sun.xml.internal.messaging.saaj.packaging.mime.internet.MimeUtility; import org.apache.commons.io.FileUtils; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import javax.servlet.http.HttpServletRequest; import java.io.File; import java.io.IOException; import java.net.URLEncoder; @Controller public class DownLoadController { @RequestMapping("/down") public ResponseEntity<byte[]> download(@RequestParam("filename") String filename, HttpServletRequest request) throws IOException { String path = request.getSession().getServletContext().getRealPath("/static/upload/"); File file = new File(path + filename); String encodedFileName = null; // 获取User-Agent,借此判断是哪儿种类型的浏览器 String header = request.getHeader("User-Agent"); if (header.indexOf("Chrome") > 0) encodedFileName = URLEncoder.encode(filename, "utf-8").replaceAll("\+", "%20"); else encodedFileName = MimeUtility.encodeWord(filename); byte[] bytes = FileUtils.readFileToByteArray(file); HttpHeaders headers = new HttpHeaders(); //设置响应的文档类型:二进制形式 headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); //弹出下载窗口,并制定文件名 headers.setContentDispositionFormData("attachment", encodedFileName); //状态码 HttpStatus httpStatus = HttpStatus.CREATED; ResponseEntity<byte[]> responseEntity = new ResponseEntity<>(bytes, headers, httpStatus); return responseEntity; } }
前端页面传要下载的图片名: