java 文件上传
MultipartResolver 是一个接口,它的实现类如下图所示,分为 CommonsMultipartResolver 类和 StandardServletMultipartResolver 类。
其中 CommonsMultipartResolver 使用 commons Fileupload 来处理 multipart 请求,所以在使用时,必须要引入相应的 jar 包;而 StandardServletMultipartResolver 是基于 Servlet 3.0来处理 multipart 请求的,所以不需要引用其他 jar 包,但是必须使用支持 Servlet 3.0的容器才可以,以tomcat为例,从 Tomcat 7.0.x的版本开始就支持 Servlet 3.0了。

1.据于CommonsMultipartResolver 的上传下载,springmvc.xml配置

<!-- 配置解析器,是因为spring容器本身底层没有对文件上传处理,因此httpservketrequest中组件的形式,非常难解析,那么配置该配置之后,spring容器,自动对httpservletrequest进行了封装MultipartServletrequest,可以配合fileupload.jar和commons.io.jar使用 
 导包:::
 commons-fileupload-1.3.1.jar
commons-io-2.2.jar
以及springmvc各种包,自定义选择!
-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <!-- 设定默认编码 -->
    <property name="defaultEncoding" value="UTF-8"></property>
    <!-- 设定文件上传的最大值为5MB,5*1024*1024 -->
    <property name="maxUploadSize" value="5242880"></property>
    <!-- 设定文件上传时写入内存的最大值,如果小于这个参数不会生成临时文件,默认为10240 -->
    <property name="maxInMemorySize" value="40960"></property>
    <!-- 上传文件的临时路径 -->
    <property name="uploadTempDir" value="fileUpload/temp"></property>
    <!-- 延迟文件解析 -->
    <property name="resolveLazily" value="true"/>
</bean>
2.文件的处理,controller配置
@RequestMapping("/upload")
public String upload(HttpServletRequest request,HttpServletResponse response) throws Exception { 
        //创建一个通用的多部分解析器  
        CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext());
        //判断 request 是否有文件上传,即多部分请求  
        if(multipartResolver.isMultipart(request)){  
            //转换成多部分request    ,由于spring的multipartResolver底层已经对request已经处理,所以以下才有强转的可能,如果没有multipartResolver处理,name在这里就有可能报错!
            MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest)request;  
            //取得request中的所有文件名  
            Iterator<String> iter = multiRequest.getFileNames();  
            while(iter.hasNext()){  
                //记录上传过程起始时的时间,用来计算上传时间  
                int pre = (int) System.currentTimeMillis();  
                //取得上传文件  
                MultipartFile file = multiRequest.getFile(iter.next());  
                if(file != null){  
                    //取得当前上传文件的文件名称  
                    String myFileName = file.getOriginalFilename();  
                    //如果名称不为“”,说明该文件存在,否则说明该文件不存在  
                    if(myFileName.trim() !=""){  
                        System.out.println(myFileName);  
                        //重命名上传后的文件名 ,用uuid防止文件重名的覆盖问题!
                        String path = request.getServletContext().getRealPath("/userfile")+"/"+UUID.randomUUID()+"_"+ myFileName;  
                        //定义上传路径  
                        System.out.println(path);
                        File localFile = new File(path);  
                        //调用下面的transfer方法,实现上传!
                        file.transferTo(localFile);  
                    }  
                }  
                //记录上传该文件后的时间  
                int finaltime = (int) System.currentTimeMillis();  
                System.out.println(finaltime - pre);  
            }  
              
        }  
        //上传成功后返回成功页面,根据自己的需要编写!
        return "/success";  
    } 
3.文件的下载,controller控制器的写法
@RequestMapping("/download")
//filename指的是链接所求文件的路径,一般是绝对路径,相对于服务器!
	public ResponseEntity<byte[]> download(HttpServletRequest request, @RequestParam("filename") String filename,
			Model model) throws Exception {
		// 下载文件路径
		String path = request.getServletContext().getRealPath("/userfile/");
		System.out.println(filename);
		File file = new File(filename);
		HttpHeaders headers = new HttpHeaders();
		// 下载显示的文件名,解决中文名称乱码问题
		String downloadFielName = new String(filename.getBytes("UTF-8"), "iso-8859-1");
		// 通知浏览器以attachment(下载方式)打开图片
		headers.setContentDispositionFormData("attachment",
				downloadFielName.substring(downloadFielName.lastIndexOf("_") + 1));
		// application/octet-stream : 二进制流数据(最常见的文件下载)。
		headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
		return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file), headers, HttpStatus.CREATED);
	
	}