web知识积累2:浏览器输入url到页面渲染过程2(浏览器渲染html页面)

苹果Mac专业的 Go 开发集成环境:JetBrains GoLand

  返回  

SpringMVC下的文件上传,文件下载(基于注解,JavaConfig配置类实现)

2021/8/21 17:22:31 浏览:

一、文件上传

在使用表单进行文件上传时,有三个要点,表单的提交方式必须为POST,提交文件的input标签必须有name,表单的Enctype属性必须为multipart/form-data。具体代码要求如下:

<form action="" method="post" enctype="multipart/form-data">
		<p>
			<input type="file" name="myfile"/>
		</p>
		
		<p>
			<button>提交</button>
		</p>
</form>

在传统的基于servlet的架构处理文件上传时,需要借助于第三方的技术 ,例如Apeche的FileUpLoad等等,我们先需要使用ServletFileUpLoad对request流进行解析,然后获得FileItem集合,然后再对FileItem集合进行遍历、判断,以获得其中上传的文件。而在SpringMVC中也集成了处理文件的技术,其中包括FileUPLoad和基于标准的Servlet3文件处理技术,相对于FileUpLoad,标准的Servlet3文件处理技术更快,性能更好,所以我们主要讲它的集成步骤。
1.DispatcherServlet核心配置类(继承了AbstractAnnotationConfigDispatcherServletInitializer抽象类的配置类),重写customizeRegistration方法,配置文件上传的具体参数。

//1.服务器启动时,配置文件上传的参数
	@Override
	protected void customizeRegistration(Dynamic registration) {
		//保存临时文件的目录,上传文件的最大容量,request的最大容量,临时文件的数量
		MultipartConfigElement config=new MultipartConfigElement("F:/test/fileupload",1024*1024*2,1024*1024*4,2);
		registration.setMultipartConfig(config);
	}

2.SpringMVC的配置类中注入MultipartResolver接口的实现类对象。注意:bean的名字必须为multipartResolver,即方法名必须为multipartResolver()。

// 注册MultiPart解析器 ,BEan的名字必须为multipartResolver
	@Bean
	public MultipartResolver multipartResolver() {
		return new StandardServletMultipartResolver();
	}

3.在Controller的负责处理上传文件的方法的参数中定义一个MultipartFile类型的参数,再使用@RequestPart注解,SpringMVC会自动将解析好的文件注入到该参数中,即可获得该文件。

@RequestMapping("/upload.do")
	public void uploadFile(@RequestPart MultipartFile myfile) {
		
		//打印文件类型
		System.out.println(myfile.getContentType());
		//打印文件名字
		System.out.println(myfile.getOriginalFilename());
		//打印文件大小
		System.out.println(myfile.getSize());
		
		//将文件保存到本地
		try {
			myfile.transferTo(new File("F:/test/fileupload"+myfile.getOriginalFilename()));
		} catch (IllegalStateException | IOException e) {
			e.printStackTrace();
		}
	}

二、文件下载

在传统的Servlet架构的文件下载中,主要步骤为获取本地文件的输入流,然后设置response的响应内容为附件,并返回文件的输出流即可,操作较为繁琐,而SpringMVC为我们进行了封装与提炼,但大致思路相同,具体代码示例如下:

//下载文件
	@RequestMapping("/download.do/{file_Name}")
	public ResponseEntity<byte[]> download(@PathVariable("file_Name") String fileName){
		String path="F:\\pachong\\movie\\all\\"+fileName;
		
		//获取上传的文件
		File downFile=new File(path);
		byte[] data=null;
		
		//读取上传的文件并存储到字节数组中
		try (FileInputStream fis = new FileInputStream(downFile)) {
			data=new byte[fis.available()];
			fis.read(data);//一次性读取所有文件信息
			
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		//响应头
		HttpHeaders headers=new HttpHeaders();
		headers.setContentDispositionFormData("attachment", fileName);//设置返回类型为一个附件,附件名字为fileName
		headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);//设置响应内容
		
		//将文件的字节数组,HTTP响应内容,HTTP状态码,交给responseEntity
		return new ResponseEntity<byte[]>(data,headers,HttpStatus.OK);
	}

联系我们

如果您对我们的服务有兴趣,请及时和我们联系!

服务热线:18288888888
座机:18288888888
传真:
邮箱:888888@qq.com
地址:郑州市文化路红专路93号