`
lp895876294
  • 浏览: 278821 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

基于SpringMVC的文件上传和下载

    博客分类:
  • JAVA
 
阅读更多

基于SpringMVC的文件上传和下载总结。

配置:

       在SpringMVC配置文件中引入Spring处理文件上传的Bean,如下:

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    	<property name="defaultEncoding" value="utf-8"></property>
    	<property name="uploadTempDir" value="upload/temp"></property>
    </bean>

 

文件上传:

注意点包括:

       1.文件上传域的表单的属性enctype必须为"multipart/form-data";带有文件域的表单提交后会刷新页面,也可以使用异步文件上传方式,参考->http://lpyyn.iteye.com/admin/blogs/2061960。

        2.使用SpringMVC处理上传,文件上传的request请求类的为MultipartRequest,获取的文件为MultipartFile。其中MultipartFile可以在方法参数中,也可以通过MultipartRequest获取。参考代码如下:

@RequestMapping("upload")
	@ResponseBody
	public String uploadFile(@RequestParam("file") MultipartFile file) throws Exception{
		logger.info("保存文件->"+file.getOriginalFilename()+"  size->"+file.getSize());
        return "ok" ;
	}

 

文件下载:

      文件下载根本上是将文件的内容写入到response的outputStream中,Spring封装了一个ResponseEntity,其中封装了response的操作,但是它对outputStream是只读操作,在创建ResponseEntity时就要将outputStream对象作为参数传入到构造函数中。因此,文件的下载选择直接使用response对象。

使用response对象需要设置返回内容的编码类型、内容类型和附件信息。参考代码如下:

/**
	 * 使用此种格式获取rest地址中文件名称及扩展名
	 * @param fileName
	 * @param format
	 * @param response
	 * @throws Exception
	 */
	@RequestMapping("download/{fileName}.{format}")
	public void downloadFile(@PathVariable(value="fileName") String fileName,
			@PathVariable(value="format") String format,HttpServletResponse response) throws Exception{
		fileName += "."+format ;
		logger.info("下载文件->"+fileName);
		//设置response对象的编码和内容类型
		response.setCharacterEncoding("utf-8");    
        //设置内容编码类型为multipart/form-data(二进制文件上传和下载使用的格式)
        response.setContentType("multipart/form-data");    
        //需要单独设置文件编码格式,只支持ISO8859-1编码格式,使用GBK编码,支持中文,UTF-8不支持中文。
        response.setHeader("Content-Disposition", "attachment;fileName="+new String(fileName.getBytes("GBK"), "ISO8859-1"));
		//直接使用response对象的输出流,避免在系统中创建文件输出流
        fileService.get(response.getOutputStream(),fileName) ;
        //不使用SpringMVC自带的ResponseEntity对象,是因为ResponseEntity的Body是只读对象
	}

 有时候直接向response.getOutputStream()中写东西有可能会失败,可以将ByteArrayOutputStream做为一个中间件,先向ByteArrayOutputStream中写数据,然后再通过response.getOutputStream()输出数据,如下:

ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream() ;
			
fileService.get(byteArrayOutputStream , fileName) ;
			
OutputStream outputStream = response.getOutputStream() ;
			
outputStream.write(byteArrayOutputStream.toByteArray()) ;
			
outputStream.flush() ; 
			
outputStream.close() ;
			
byteArrayOutputStream.close() ;

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics