<强>写在前面强>
谈到文件上传,首先要说业务逻辑,如果上传的文件大家都可以看(比如广告或者首页的横幅)等,那么我们就把图片放在静态资源区(与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文件上传及查看的示例代码