欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

springmvc文件的上传和下载

程序员文章站 2022-06-02 14:30:07
...

      Spring MVC为文件上传提供了直接的支持,这种支持是用即插即用的MultipartResolver实现的。Spring MVC使用Apache Commons FileUpload技术实现了一个MultipartResolver实现类:CommonsMultipartResolver。因此,SpringMVC的文件上传还需要依赖Apache Commons FileUpload的组件。

springmvc文件的上传和下载

1.前台通过ajax获取到服务器返回的json的文件的信息展示到页面。

springmvc文件的上传和下载

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();    
    }

这样可以下载的文件在火狐和谷歌浏览器可以显示中文名字。

 

springmvc文件的上传和下载
但是IE浏览器就下载下来的名字和格式会乱了,需要自己用打开方式选择来打开,这是一个还没有解决的问题,先记录下来。
springmvc文件的上传和下载