上传下载文件

发表时间:2017-07-18 18:40:44 浏览量( 43 ) 留言数( 0 )

学习目标:

1、了解Spring对文件的上传和下载


学习过程:

    我们同样在之前的struts2中讲过上传和下载的功能,前端的操作和之前是一样的,这里就不啰嗦了。我们主要看一下后台的control类。事实上spring对上传和下载的封装更简单一些。

1、先导入相关的io包

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

2、定义上传处理的bean

    	<!-- 支持上传文件 -->
	<bean id="multipartResolver"
		class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
		<property name="defaultEncoding" value="UTF-8" />
		<property name="maxUploadSize" value="-1"></property>
	</bean>

3、定义control

@Controller
public class FileControl {
	
	

	/**
	 * 
	* @Description: 单文件上传
	* @author: liubao
	* @param 
	* @return 
	 * @throws IOException 
	 * @throws IllegalStateException 
	* @date:  2018年2月7日 下午2:59:05
	 */
	@RequestMapping(value = "/fileUpload", consumes = "multipart/form-data")
	public String fileUpload(@RequestParam("file") MultipartFile file, @RequestParam("description") String description,HttpServletRequest request) throws IllegalStateException, IOException {

		 //如果文件不为空,写入上传路径
        if(!file.isEmpty()) {
            //上传文件路径
            String path = request.getServletContext().getRealPath("/images/");
            //上传文件名
            String filename = file.getOriginalFilename();
            File filepath = new File(path,filename);
            //判断路径是否存在,如果不存在就创建一个
            if (!filepath.getParentFile().exists()) { 
                filepath.getParentFile().mkdirs();
            }
            //将上传文件保存到一个目标文件当中
            file.transferTo(new File(path + File.separator + filename));
            return "success";
        } else {
            return "error";
        }

	}

	/**
	 * 
	* @Description:  多文件上传
	* @author: liubao
	* @param 
	* @return 
	* @date:  2018年2月7日 下午2:58:57
	 */
	@RequestMapping(value = "/fileUploads", consumes = "multipart/form-data")
	public String fileUploads(@RequestParam("files") CommonsMultipartFile files[], HttpServletRequest request,
			ModelMap model) {

		System.out.println(request.getParameter("name"));

		for (MultipartFile file : files) {
			System.out.println(file.getOriginalFilename());
            //文件处理省了....
		}


		return "hello";
	}

	/**
	 * 
	* @Description: 文件下载
	* @author: liubao
	* @param 
	* @return 
	* @date:  2018年2月7日 下午2:59:52
	 */
	@RequestMapping(value = "/fileDown")
	public ResponseEntity<byte[]> download(HttpServletRequest request,
			Model model) throws Exception {
		// 下载文件路径
		 String path="D:\\workspace\\.metadata\\.plugins\\org.eclipse.wst.server.core\\tmp0\\wtpwebapps\\springMVC\\WEB-INF\\upload\\图片10(定价后).xlsx";  
	     File file=new File(path); 
		byte[] bytes = fileToBytes(file);
		
		System.out.println(bytes.length);

		HttpHeaders headers = new HttpHeaders();
		// 下载显示的文件名,解决中文名称乱码问题
		String downloadFielName = new String("下载文件名称".getBytes("UTF-8"), "iso-8859-1");
		// 通知浏览器以attachment(下载方式)打开图片
		headers.setContentDispositionFormData("attachment", downloadFielName);
		// application/octet-stream : 二进制流数据(最常见的文件下载)。
		headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
		return new ResponseEntity<byte[]>(bytes, headers, HttpStatus.CREATED);
	}
	
	public static byte[] fileToBytes( File file ) {
        byte[] buffer = null;

        FileInputStream fis = null;
        ByteArrayOutputStream bos = null;

        try {
            fis = new FileInputStream(file);
            bos = new ByteArrayOutputStream();

            byte[] b = new byte[1024];

            int n;

            while ((n = fis.read(b)) != -1) {
                bos.write(b, 0, n);
            }
            
            buffer = bos.toByteArray();
        } catch (Exception ex) {
           ex.printStackTrace();
        } finally {
            try {
                if (null != bos) {
                    bos.close();
                }
            } catch (IOException ex) {
              ex.printStackTrace();
            } 
        }
        
        return buffer;
    }

}