spring实现文件上传和下载 完整方案

1. 简介

提供基于spring实现文件(笔记附件)的上传和下载的完整方案。方案将文件上传,并将文件名称作为字段与关联的笔记绑定在一起,更新笔记在数据库中的记录。显示笔记时,根据笔记所绑定的文件名生成下载路径,提交给服务端完成下载。

2. 文件上传

2. 1 前端

在html中插入一个表单用于提交文件
  1. <form id"uploadForm">  
  2.     <input type="file" name="file" id="file"/>  
  3.         <input type="button" id="upload" value="上传附件"/>  
  4. </form>  
<form id= "uploadForm">
	<input type="file" name="file" id="file"/>
        <input type="button" id="upload" value="上传附件"/>
</form>

编写js给button单击事件,发送ajax请求,将文件数据上传给服务端,服务端返回存储的真实文件名,将文件名绑定在笔记元素上,在保存笔记时,将文件名写入相应笔记的数据库记录中。
  1. //给上传文件按钮绑定事件  
  2.             $("#upload").click(uploadFile);  
//给上传文件按钮绑定事件
			$("#upload").click(uploadFile);

  1. function uploadFile(){  
  2.     //获得上传文件  
  3.     $.ajax({  
  4.         url: 'file/upload.do',  
  5.         type: 'POST',  
  6.         cache: false,  
  7.         data: new FormData($('#uploadForm')[0]),  
  8.         processData: false,  
  9.         contentType: false,  
  10.         success:function(result){  
  11.             var $checkedLi = $("#note_list li a.checked").parent();  
  12.             $checkedLi.data("attachment",result.data);  
  13.             alert("上传成功"+result.data);  
  14.         }  
  15.     });   
  16. }  
		function uploadFile(){
			//获得上传文件
			$.ajax({
			    url: 'file/upload.do',
			    type: 'POST',
			    cache: false,
			    data: new FormData($('#uploadForm')[0]),
			    processData: false,
			    contentType: false,
			    success:function(result){
					var $checkedLi = $("#note_list li a.checked").parent();
					$checkedLi.data("attachment",result.data);
					alert("上传成功"+result.data);
			    }
			});	
		}

1. 2 后端

采用CommonsMultipartResolver,需要导入commons-fileupload-1.2.1.jar和commons-io-1.3.2.jar,sc是ServletContext的引用,用实现ServletContextAware接口的方式获得。
  1. public JsonResult upload(HttpServletRequest request,HttpServletResponse response) throws Exception{  
  2.     JsonResult result = new JsonResult();  
  3.     try{  
  4.         request.setCharacterEncoding("utf-8");  
  5.         //创建一个通用的多部分解析器  
  6.         CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(sc);  
  7.         //判断 request 是否有文件上传,即多部分请求  
  8.         if(multipartResolver.isMultipart(request)){  
  9.             //转换成多部分request    
  10.             MultipartHttpServletRequest multiRequest =           
  11.                     multipartResolver.resolveMultipart(request);  
  12.             //取得request中的所有文件名  
  13.             Iterator<String> iter = multiRequest.getFileNames();  
  14.             while(iter.hasNext()){  
  15.                 //取得上传文件  
  16.                 MultipartFile file = multiRequest.getFile(iter.next());  
  17.                 if(file != null){  
  18.                     //取得当前上传文件的文件名称  
  19.                     String myFileName = file.getOriginalFilename();  
  20.                     //如果名称不为“”,说明该文件存在,否则说明该文件不存在  
  21.                     if(myFileName.trim() !=""){  
  22.                         //重命名上传后的文件名  
  23.                         String fileName = file.getOriginalFilename();  
  24.                         //定义上传路径  
  25.                         String dirPath = sc.getRealPath("/WEB-INF/files/");  
  26.                         File dir = new File(dirPath);  
  27.                         if(!dir.exists()){  
  28.                             dir.mkdirs();  
  29.                         }  
  30.                         File localFile = new File(dir, NoteUtil.creatId().substring(30)+"-"+fileName);  
  31.                         file.transferTo(localFile);  
  32.                         //结果绑定文件路径  
  33.                         result.setStatus(0);  
  34.                         result.setData(localFile.getName());  
  35.                         result.setMsg("上传成功");  
  36.                     }  
  37.                 }  
  38.             }  
  39.         }  
  40.   
  41.     }catch(Exception e){  
  42.         e.printStackTrace();  
  43.         throw e;  
  44.     }  
  45.     result.setStatus(1);  
  46.     return result;  
  47. }  
	public JsonResult upload(HttpServletRequest request,HttpServletResponse response) throws Exception{
		JsonResult result = new JsonResult();
		try{
			request.setCharacterEncoding("utf-8");
			//创建一个通用的多部分解析器
			CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(sc);
			//判断 request 是否有文件上传,即多部分请求
			if(multipartResolver.isMultipart(request)){
				//转换成多部分request  
				MultipartHttpServletRequest multiRequest =         
						multipartResolver.resolveMultipart(request);
				//取得request中的所有文件名
				Iterator<String> iter = multiRequest.getFileNames();
				while(iter.hasNext()){
					//取得上传文件
					MultipartFile file = multiRequest.getFile(iter.next());
					if(file != null){
						//取得当前上传文件的文件名称
						String myFileName = file.getOriginalFilename();
						//如果名称不为“”,说明该文件存在,否则说明该文件不存在
						if(myFileName.trim() !=""){
							//重命名上传后的文件名
							String fileName = file.getOriginalFilename();
							//定义上传路径
							String dirPath = sc.getRealPath("/WEB-INF/files/");
							File dir = new File(dirPath);
							if(!dir.exists()){
								dir.mkdirs();
							}
							File localFile = new File(dir, NoteUtil.creatId().substring(30)+"-"+fileName);
							file.transferTo(localFile);
							//结果绑定文件路径
							result.setStatus(0);
							result.setData(localFile.getName());
							result.setMsg("上传成功");
						}
					}
				}
			}

		}catch(Exception e){
			e.printStackTrace();
			throw e;
		}
		result.setStatus(1);
		return result;
	}

2. 文件下载

2. 1 前端

由于get请求存在中文编码异常的问题,所以采用post请求,首先获取元素中绑定的文件名,生成一个表单
  1. if(attachment!=null){  
  2.     var form_str = '<form action="file/download.do" method="post">'+  
  3.                         '<input type="hidden" name="fileName" value="'+attachment+'"></input>'+  
  4.                         '<input type="submit" value="下载附件"></input>'+  
  5.                     '</form>';  
  6.     $("#download_attachment").html(form_str);  
  7. }  
			if(attachment!=null){
				var form_str = '<form action="file/download.do" method="post">'+
									'<input type="hidden" name="fileName" value="'+attachment+'"></input>'+
									'<input type="submit" value="下载附件"></input>'+
								'</form>';
				$("#download_attachment").html(form_str);
			}

2. 2 后端

后端需要解决中文文件名无法正常显示的问题,采用ISO8859-1字符集
  1. public void download(HttpServletResponse response, String fileName) throws Exception{  
  2.     System.out.println(fileName);  
  3.     String filePath = "/WEB-INF/files/"+fileName;  
  4.     String fileFullPath = sc.getRealPath(filePath);  
  5.     File file = new File(fileFullPath);  
  6.     if(file.exists()){  
  7.         //重置response  
  8.         response.reset();  
  9.         response.setCharacterEncoding("utf-8");  
  10.         response.setContentType("text/html;charset=utf-8");  
  11.         //设置http头信息的内容  
  12. /           response.addHeader("Content-Disposition""attachment;filename=\""+fileName+"\"");  
  13.         //解决中文文件名显示问题  
  14.         response.addHeader("Content-Disposition""attachment;filename="+new String(fileName.getBytes("gb2312"),"ISO8859-1"));  
  15.         //设置文件长度  
  16.         int fileLength = (int)file.length();  
  17.         response.setContentLength(fileLength);  
  18.           
  19.         if(fileLength!=0){  
  20.             InputStream inStream = new FileInputStream(file);  
  21.             byte[] buf = new byte[4096];  
  22.               
  23.             //创建输出流  
  24.             ServletOutputStream servletOS = response.getOutputStream();  
  25.             int readLength;  
  26.               
  27.             //读取文件内容并写入到response的输出流当中  
  28.             while((readLength = inStream.read(buf))!=-1){  
  29.                 servletOS.write(buf, 0, readLength);  
  30.             }  
  31.             //关闭输入流  
  32.             inStream.close();  
  33.               
  34.             //刷新输出流缓冲  
  35.             servletOS.flush();  
  36.               
  37.             //关闭输出流  
  38.             servletOS.close();  
  39.         }  
  40.     }else{  
  41.         response.setContentType("text/html;charset=utf-8");  
  42.         PrintWriter out = response.getWriter();  
  43.         out.println("文件\""+fileName + "\"不存在");  
  44.     }  
  45. }  
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值