Spring MVC为文件上传提供了直接的支持,这种支持是用即插即用的MultipartResolver实现的。Spring MVC使用Apache Commons FileUpload技术实现了一个MultipartResolver实现类:CommonsMultipartResolver。因此,SpringMVC的文件上传还需要依赖Apache Commons FileUpload的组件。
1.前台通过ajax获取到服务器返回的json的文件的信息展示到页面。
ajax展示文件代码
<script type="text/javascript"> //动态加载文件 $(function() { $.ajax({ type: 'post', url: 'findfile', contentType: 'application/json;charset=utf-8', success: function (data) { //返回json结果 var ol = $("#fileol"); var filedown = $("#filedown"); filedown.empty(); ol.empty(); $.each(data,function(index,val){ ol.append("<li>"+val.fileName+"</li>"); filedown.append('<a href=download/'+val.fileId+'><span class="glyphicon glyphicon-save" aria-hidden="true"></span></a> <br>'); }); } }); }); </script>
通过页面的id元素来获取控件,然后把取得的数据填充进去。
提交表单时需要选择文件的类型
from表单添加属性
enctype="multipart/form-data"
springmvc.xml配置上传解析器
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- 设定默认编码 --> <property name="defaultEncoding" value="UTF-8" /> <!-- 设定文件上传的最大值5MB,5*1024*1024 --> <property name="maxUploadSize" value="5242880" /> <property name="maxInMemorySize" value="4096" /> </bean>
后台上传文件的代码,使用MultipartFile类就可以获取文件的相关信息。
//上传文件 @RequestMapping("/uploadfile") public ModelAndView uploadfile( HttpServletRequest request, MultipartFile file//接收文件 ) throws Exception { ModelAndView modelAndView = new ModelAndView(); //原始名称 String originalFilename = file.getOriginalFilename(); //上传文件 if(file!=null && originalFilename!=null && originalFilename.length()>0){ Pan pan=new Pan(); //存储的物理路径 String fileurl = pan.getFileuploadurl(); //文件的全路径 File newFile = new File(fileurl+originalFilename); //将内存中的数据写入磁盘 file.transferTo(newFile); //访问的路径 String file_url=pan.getFiledownurl()+originalFilename; List<ZhangFile> zhangFileList=zhangFileService.selectAllZhangFile(); int length=zhangFileList.size(); //判断数据库里面是否有这个文件 boolean flag=false; for(int i=0;i<length;i++){ if(zhangFileList.get(i).getFileName().equals(originalFilename)){ flag=true; break; } } //没有的话就插入 if(!flag){ ZhangFile zhangfile=new ZhangFile(); zhangfile.setFileName(originalFilename); zhangfile.setFileUrl(file_url); zhangfile.setFileTime(new Date()); zhangFileService.insert(zhangfile); } modelAndView.addObject("zhangfilelist", zhangFileList); /*System.out.println(zhangFileList.toString()); System.out.println(originalFilename+" "+newFile);*/ } //modelAndView.setViewName("admin/other/other-index"); return new ModelAndView("redirect:/admin/other-index"); }
下载文件的代码:
// 下载功能 @RequestMapping(value = "/download/{fileId}") public void download(HttpServletRequest request, HttpServletResponse response, @PathVariable("fileId") Integer fileId) throws Exception { // 前台传来id,根据id从数据库找到对应的文件名字 ZhangFile zhangfile = zhangFileService.selectByPrimaryKey(fileId); String filename = zhangfile.getFileName(); response.setContentType("text/html;charset=UTF-8"); request.setCharacterEncoding("UTF-8"); // 读取目标文件,通过response将目标文件写到客户端 // 获取目标文件的绝对路径 // 下载文件路径前缀 path="D:/OnlineJudge/tomcat_normal/webapps/StudyFiles/" String path = new Pan().getFileuploadurl(); String fullFileName = path + filename; long fileLength = new File(fullFileName).length(); // 下载显示的文件名,解决中文名称乱码问题 if (request.getHeader("User-Agent").toLowerCase().indexOf("firefox") > 0) { filename = new String(filename.getBytes("UTF-8"), "ISO8859-1"); }// firefox浏览器 else if (request.getHeader("User-Agent").toUpperCase().indexOf("MSIE") > 0) { filename = URLEncoder.encode(filename, "UTF-8"); }// IE浏览器 response.reset(); // 设置文件MIME类型 response.setContentType(request.getServletContext().getMimeType( filename)); // 设置Content-Disposition response.setHeader("Content-Disposition", "attachment;filename=" + filename); response.setHeader("Content-Length", String.valueOf(fullFileName)); // 读取目标文件,通过response将目标文件写到客户端 // 读取文件 BufferedInputStream bis = new BufferedInputStream(new FileInputStream(fullFileName)); BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream()); byte[] buff = new byte[2048]; int bytesRead; while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) { bos.write(buff, 0, bytesRead); } bis.close(); bos.close(); }
这样可以下载的文件在火狐和谷歌浏览器可以显示中文名字。
但是IE浏览器就下载下来的名字和格式会乱了,需要自己用打开方式选择来打开,这是一个还没有解决的问题,先记录下来。