springmvc文件的上传和下载

      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元素来获取控件,然后把取得的数据填充进去。

后台上传文件的代码,自定义一个文件类

	//上传文件
	@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浏览器就下载下来的名字和格式会乱了,需要自己用打开方式选择来打开,这是一个还没有解决的问题,不管了先记录下来。


猜你喜欢

转载自blog.csdn.net/bushqiang/article/details/80216206