基于spring Mvc的文件上传下载
一个spring框架提供的文件上传下载,下面直接贴代码:
由于工作需要,我这里写的是图片上传,但是原理都是一样的,这里写的有上传下载和不怎么常用的删除。
由于文件名可能会重复,所以应该使用uuid把文件名重命名
下面是一个工具类:
public class FileLoadUtil{ /** * 图片上传 * @param request * @param file */ public static String upload(HttpServletRequest request, MultipartFile file){ //获取文件上传的路径 String path = request.getServletContext().getRealPath("/images"); //如果上传目录不存在,则创建出来 File dir = new File(path); if(!dir.exists()){ dir.mkdir(); } //获取上传的文件名 String fileName = file.getOriginalFilename(); //重新定义文件名防止重名被替换 String uuid = UUIDUtil.createUUID(); fileName = uuid + fileName.substring(fileName.indexOf(".")); //构建一个完整文件信息 File fileMessage = new File(dir.getAbsolutePath() + "/" + fileName); try { //执行上传,调用transferTo方法 file.transferTo(fileMessage); } catch (IOException e) { e.printStackTrace(); throw new RuntimeException("上传图片失败"); } return fileName; } /** * 图片下载 * @param fileName * @param request * @return */ public static ResponseEntity<byte[]> downLoad(String fileName,HttpServletRequest request){ //获取下载路径 String path = request.getServletContext().getRealPath("/images"); //构建下载文件 File file = new File(path + "/" + fileName); //创建HttpHeaders设置响应头信息 HttpHeaders headers = new HttpHeaders(); try { //设置在响应头中的文件名称,这里进行重新编码,防止中文乱码 String headerFileName = new String(fileName.getBytes("UTF-8"), "ISO-8859-1"); //设置内容以附件的方式下载 headers.setContentDispositionFormData("attachment", headerFileName); //设置相应类型为application/octet-stream headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); //创建ResponseEntity对象 ResponseEntity<byte[]> entity = new ResponseEntity<>(FileUtils.readFileToByteArray(file), headers, HttpStatus.CREATED); return entity; } catch (Exception e) { e.printStackTrace(); throw new RuntimeException("文件下载失败"); } } /** * 删除图片 * @param name * @param request * @return */ public static String deletePhoto(String name,HttpServletRequest request){ if(name ==null){ return "没有图片可以删除"; }else{ //获取服务器路径+文件目录 String path = request.getServletContext().getRealPath("/images"); //构建完整的文件信息 File file = new File(path + "/" + name); //判断文件是否存在,存在则删除 if(file.exists()){ //调用delete方法删除文件 file.delete(); } return "删除图片成功"; } } }
View Code
工具类写好了我们来看一下控制层应该怎么写:
因为前端不一定会选择图片上传,也就是说图片不是必选的是选填的,所以我们应该做一个文件是否为空的判断。
@RequestMapping("/save.json") @ResponseBody public JsonData saveUser(ExchangeParam param, HttpServletRequest request, @RequestParam("file") MultipartFile file) { if(!file.isEmpty()){ String name = FileLoadUtil.upload(request,file); param.setPhotoName(name); } exchangeService.save(param); return JsonData.success(); }
配置上传解析器,如果不进行配置默认则使用StandardServletMultipartResolver解析器, 它是基于Servlet3.0的上传方式 这里使用commons-fileupload上传,
因此使用CommonsMultipartResolver解析器
所以我们需要在pom.xml文件依赖jar包
<dependencies> <!-- https://mvnrepository.com/artifact/commons-io/commons-io --> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.4</version> </dependency> <!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload --> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.1</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> </dependency>
依赖完jar包之后,我们需要在dispatcher-servlet.xml配置一下
<mvc:default-servlet-handler/> <!-- 配置上传解析器,如果不进行配置默认则使用StandardServletMultipartResolver解析器, 它是基于Servlet3.0的上传方式 这里使用commons-fileupload上传,因此使用CommonsMultipartResolver解析器 注意:bean的id必须是multipartResolver--> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- 限制上传大小(单位:字节) --> <property name="maxUploadSize" value="5242880"/> <!-- 指定默认编码--> <property name="defaultEncoding" value="utf-8"/> </bean>
好了,到了最后一步了,前端页面一个form表单就够了,应该注意的是怎么去把表单内容连同文件一起异步提交到后台
如果不需要异步请求直接通过表单提交的话只需要在form表单头部指定
enctype="multipart/form-data"
如果是通过ajax或者axios的话需要用到一个FormData方法,因为这个方法是把整个表单对象格式,所以jquery可能会获取不到对象里面的内容,
所以我个人用的是最原始的方法:
dcument.getElementById()
需要注意的是,使用FormData异步提交在ajax里面需要设置几个属性:
cache: false,
processData: false,
contentType: false,
var form = document.getElementById("id"); var formData = new FormData(form); $.ajax({ url :url, type : 'POST', data : formData, cache: false, processData: false, contentType: false, success : function(result) { //提交成功后执行的方法 } })