转载

Springmvc之文件上传和下载

  • 在上传和下载之前需要在对应的根目录下创建对应的文件夹,比如我们在 webApp 下创建 upload 文件夹下

## 添加依赖

commons-io
commons-fileupload
<!-- 添加文件上传的依赖 -->
	<dependency>
		<groupId>commons-io</groupId>
		<artifactId>commons-io</artifactId>
		<version>2.4</version>
	</dependency>

	<dependency>
		<groupId>commons-fileupload</groupId>
		<artifactId>commons-fileupload</artifactId>
		<version>1.3.1</version>
	</dependency>

在配置文件中配置(spring-mvc.xml)

  • id 的名称一定是 multipartResolver ,不能任意指定
<!-- 上传组件的解析器 -->
<beanid="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
	<!-- 上传文件大小 -->
	<propertyname="maxUploadSize"value="10000000"></property>
        <!-- 请求的编码格式,必须和jSP的pageEncoding属性一致,以便正确读取表单的内容,默认为ISO-8859-1 -->
	<propertyname="defaultEncoding"value="utf-8"></property>
</bean>

制作上传表单

POST
enctype="multipart/form-data"
<formaction="${pageContext.request.contextPath }/upload/upload.do"method="POST"enctype="multipart/form-data">
	file: <inputtype="file"name="file"value="上传"> 
	<br>
	<inputtype="submit"value="上传">
</form>

完成controller

  • 上传的参数一定为 MultipartFile file
@RequestMapping("/upload.do")
	public String uplaod(MultipartFile file)throws IllegalStateException, IOException{
		String fileName=file.getOriginalFilename();  //获取文件名
		Long fileSize=file.getSize();   //获取文件大小
		//上传 参数是文件上传后储存的路径,最终的文件上传后的文件路径为/home/chenjiabing/Documents/Blog/fileName
		file.transferTo(new File("/home/chenjiabing/Documents/Blog",fileName));
		//重定向到首页
		return "redirect:../main/showIndex.do";
	}

异步上传文件

定义表单

  • 设置 onchange 事件,只要input的改变了,那么就上传文件
<inputtype="file"name="file"value=""id="iconPic"onchange="getImageFun()">

定义Controller

  • 其中的参数最好定义映射关系 @RequestParam("file") ,否则有时候会出现不对应的情况
  • 数据库中保存的文件的路径不需要保存项目路径,只需要保存项目的文件路径即可,比如 /upload/文件名 ,那么我们使用 http://localhost:8080/TeduStore/upload/文件名 就能访问到
@RequestMapping("/getImage.do")
@ResponseBody
public ResponseResult<Void> getImage(@RequestParam("file")MultipartFile file,HttpSession session)throws IllegalStateException, IOException{
	ResponseResult<Void> result=new ResponseResult<Void>();  //创建结果集对象
	
	String projectPath=session.getServletContext().getRealPath("/");  //获取项目的根路径
	//如果文件不为空
	if (!file.isEmpty()) {
		String fileName=file.getOriginalFilename();  //文件的真实名称
           
           //使用UUID算法,获取随机的文件名
		UUID uuid=UUID.randomUUID();  
           
		//随机生成的文件名
		fileName=uuid.toString()+fileName.substring(fileName.lastIndexOf("."));
		
           User user=(User) session.getAttribute("user");
		//数据库保存的就是 /upload/+文件名即可,不需要保存projectPath+"/upload/"+fileName
		userservice.UpdateImage(user.getId(), "/upload/"+fileName);
           
		//上传文件 上传成功后的路径: 项目的根路径/upload/fileName
		file.transferTo(new File(projectPath,"/upload/"+fileName));
		
		result.setState(1);
		result.setMessage("上传成功");
	}
	return result;
}

AJAx异步提交

  • 必须设置 contentType:false , processData:false
  • 使用 FormData 对象保存数据,当然处理文件类型(File类型)的,我们也可以存储键值对,比如 formdata.append("username","jack") ,最后一起提交即可
//上传文件的方法
functiongetImageFun(){
	var file=document.getElementById("iconPic").files[0];  //获取当前的file
	// 创建FormData对象
	var formData=new FormData();
	formData.append("file",file);  //将文件放入formData中
	$.ajax({
		"url":"${pageContext.request.contextPath}/user/getImage.do",
		"data":formData,
		"type":"post",
		"dataType":"json",   //返回数据类型
		"contentType":false,  //不设置上传文件类型 ,因为上传的文件有多种类型的
		"processData":false,    //不处理数据
		"success":function(obj){
			alert(obj.message);
			var url=window.URL.createObjectURL(file);  //获取上传的的本地路径
			$("#icon").attr("src",url);  //将上面的头像显示为当前选择的图片
		}
	})
}

文件下载

  • 直接在输入地址即可,比如: http://localhost:8080/TeduStore/upload.do/download.do?fileName=1.jpg
/**
 * 文件下载
 * @param fileName  文件名
 * @param request  
 * @throws IOException
 */	
@RequestMapping("/download.do")
public ResponseEntity<byte[]> download(@RequestParam("fileName")String fileName,HttpServletRequest request) throws IOException{
	//获取下载文件的路径,在文件中的真实路径
	String path=request.getServletContext().getRealPath("/upload/");
	//下载文件的全路径
	File file=new File(path+File.separator+fileName);
	HttpHeaders headers = new HttpHeaders();  
       //下载显示的文件名,解决中文名称乱码问题
       String downloadFielName = new String(fileName.getBytes("UTF-8"),"iso-8859-1");
       //通知浏览器以attachment(下载方式)打开图片
       headers.setContentDispositionFormData("attachment", downloadFielName); 
       //application/octet-stream : 二进制流数据(最常见的文件下载)。
       headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
        
       return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),    
               headers, HttpStatus.CREATED); 
}
原文  https://chenjiabing666.github.io/2018/05/21/Springmvc之文件上传和下载/
正文到此结束
Loading...