SpringMVC文件上传及查看的示例代码

  

<强>写在前面

  

谈到文件上传,首先要说业务逻辑,如果上传的文件大家都可以看(比如广告或者首页的横幅)等,那么我们就把图片放在静态资源区(与css, js一样的位置)中,如果文件是受保护的(像用户只能查看自己上传的照片),那么我们就把它存放在服务器中的某个专门存放图片的位置。
  

  

本例分别展示了存放在两个位置的上传文件的方法,上传之后,作为延伸,还添加了查看上传的文件以及下载已经上传的文件的功能。

  

<强>准备工作

  

配置SpringMVC,导入共用包
  

  

在mvc-servlet。xml中配置文件上传解析器
  

        & lt; !——文件上传解析器——比;   & lt; bean id=" multipartResolver "   类=皁rg.springframework.web.multipart.commons.CommonsMultipartResolver”比;   & lt;属性名=" maxUploadSize " value=" https://www.yisu.com/zixun/1000000 "/比;   & lt;属性名=" defaultEncoding " value=" https://www.yisu.com/zixun/UTF-8 "/比;   & lt;/bean>      

<强>存放在静态资源区

  

1,存放位置:
  

  

存放在项目中,所以路径为相对项目的路径。
  

  

/{志愿者项目}/webapp/静态/img

  

2,配置响应的处理程序

        @ controller   公开课UploadController {   @GetMapping("/上传”)   公共字符串UploadHandler () {   返回“上传”;   }      @PostMapping(“/上传/静态”)   公共空间wriToStatic (HttpServletRequest请求,   RedirectAttributes RedirectAttributes,   @RequestParam(“文件名”)MultipartFile文件){   如果(! file.isEmpty ()) {//获取目标文件夹   字符串路径=request.getServletContext () .getRealPath(“/? +“静态/img/?//获取用户上传的源文件名   字符串文件名=file.getOriginalFileName ();//新建文件   文件file1=新文件(路径,文件名);//将文件写入   file.transferTo (file1);      redirectAttributes。addFlashAttribute(“信息”,“上传静态成功”);   返回“重定向:/上传”;   其他}{   redirectAttributes。addFlashAttribute(“信息”,“上传文件不能空”);   返回“重定向:/上传”;   }      }   }      之前      

<强>存放在服务器

  

1,本例存放位置:
  

  

存放在服务器某个位置,与项目无关,所以地址为绝对路径。
  

  

/用户/mac/桌面/imgtemp/为目录的绝对路径。

  

2,配置响应的处理程序

        …   @PostMapping(“/上传/磁盘”)   公共字符串writeToDisk (HttpServletRequest请求,   @RequestParam MultipartFile文件(“文件名”),   RedirectAttributes RedirectAttributes) {   如果(! file.isEmpty ()) {//获取源文件名   字符串文件名=file.getOriginalFileName ();//获取保存文件文件夹路径   字符串路径="/用户/mac/桌面/imgtemp/?//新建文件   文件file1=新文件(路径,文件名);//写入文件   file.transferTo (file1);   }      }   …      之前      

<强>延伸部分(文件的查看及下载)

  

由于响应是要以流的形式传递文件,我们需要正确的设置响应的MIMIE类型才能被浏览器正确的解析,应用程序文件的默认MIMIE类型为应用程序/八进制,MIME设置为该值后,浏览器不会自动执行或询问执行这类文件,会以对待附件的形式直接将文件下载至本地。

  

更多关于MIMIE的解读请查看这篇文章

  

如果我们如果想自定义下载文件的名字,那么就需要设置的附加消息。
  附加项消息头指示回复的内容该以何种形式展示,是以内联的形式(即网页或者页面的一部分),还是以附件的形式下载并保存到本地。

  

更过关于附加的解读请查看这篇文章

        …   @GetMapping(“/下载/byDefault”)   公共空间getImgByDefault (@RequestParam字符串文件名,   @RequestParam (=false, defaultValue=" ")字符串saveName),   {HttpServletResponse反应   如果(StringUtils.isEmpty(文件名)){   response.sendError (404);   返回;   }//文件存放的路径   字符串路径="/用户/mac/桌面/imgtemp/?//新建文件   文件文件=新文件(路径,文件名);      如果(! file.exists ()) {   response.sendError (404);   返回;   }//如果请求参数saveName不为空,进行文件的下载   如果(! StringUtils.isEmpty (saveName)) {//设置响应长度   response.setContentLength ((int) file.length ());//设置响应的MIME类型为应用程序/八进制   response.setContentType (MediaType.APPLICATION_OCTET_STREAM_VALUE);      saveName=新的字符串(saveName.getBytes (“utf - 8”)、“ISO8859-1”);//设置的附加为附件;文件名=saveName   response.setHeader (HttpHeaders。CONTENT_DISPOSITION,”附件;文件名=\ " + saveName + " \ ");   }//读取文件   InputStream是=new FileInputStream(文件);   OutputStream os=response.getOutputStream ();//将文件以流的形式输出   IOUtils.copy (os);   os.flush ();   os.close ();   is.close ();      }      

SpringMVC文件上传及查看的示例代码