欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

文件的上传和下载

程序员文章站 2022-04-30 21:10:01
...

req.getServletContext().getRealPath(“files”)获取某个文件夹的全路径

文件下载

  • 访问资源时响应同如果没有设置content-Disposition,浏览器默认按照inline值进行处理
  • inline表示请求的资源能显示就显示,不能显示才下载
  • 如果想要恒下载:修改响应头中Context-Disposition=“attachment;filename=文件名”,这个filename表示下载的文件以这个字符串命名
<a href="download?file=a.txt">download</a>

ServletOutputStream和PrintWriter的功能都是将数据输出给浏览器,前者以流的形式,后者以字符串的形式,对于流的形式,可以导入commons-io jar包,用工具类得到字节数组

@RequestMapping("download")
	public void download(@RequestParam("file")String fileName,HttpServletResponse resp,HttpServletRequest req) throws IOException{
		//设置响应头某个属性的值就可以用serHeader、,包括之前的content-Type也可以用setHeader设置
		//设置响应头中的filename可以不和真实的文件名一样,但是请求的文件名fileName必须是名字存在的文件
		resp.setHeader("content-Disposition", "attachment;filename="+fileName);
		//拿到目标文件,getRealPath第一个参数是文件夹从项目根目录开始的相对路径,第二个参数是文件名,返回文件从磁盘根目录开始的全路径
		File file = new File(req.getServletContext().getRealPath("files"),fileName);
		//commens-io 和 Commons-fileupload 两个jar包,使用工具类将文件转弯二进制数组
		byte[] bytes = FileUtils.readFileToByteArray(file);
		ServletOutputStream os = resp. getOutputStream();
		os.write(bytes);
		os.flush();
		os.close();
		
	}

文件上传

基于Ccommons-fileupload.jar完成
MutipartResolver组件作用:把客户端上传的文件流转换成MutipartFile封装类,通过MutipartFile类获取到文件流(既然是组件,就需要在springmvc配置文件中进行 配置)
表单数据类型分类:

  • enctype默认值为application/x-www-form-urlencoded,表示普通表单数据(少量文字信息)
  • text/plain 大文字量时使用的类型
  • multipart/form-data 表单中包含二进制文件内容(要传文件必须设置这个,设置了之后其他类型的数据依旧可以正常提交)

springmvc中配置multipart组件

maxUploadSize限制上传文件大小(字节数)

	 <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
      	<property name="maxUploadSize" value="10240"></property>
      </bean>

jsp中设置表单数据类型

method必须是post,不允许是get

	<form action="upload" enctype="multipart/form-data" method="post">
		文件:<input type="file" name="file"><br>
		<input type="submit" value="提交">
	</form>

controller

在jsp上传之后,因为配置了组件,上传的文件会封装到组件的Multipart类中,controllerMethod中可以拿到这个类,拿到文件的流和文件名,文件名不同的浏览器不一致,可以只拿后缀,然后UUID拼一个随机文件名,同样和下载一样,使用Commons的jar包,工具类将文件流转到一个新建文件中

@RequestMapping("upload")
	public String demo(MultipartFile file) throws IOException{
		//获取文件名 有的浏览器文件名不带路径,有的浏览器文件名是全路径的
		String fileName = file.getOriginalFilename();
		//不获取文件的名字,只获取文件的后缀  subString是jdk String类中方法 包头不包尾
		String suffix = fileName.substring(fileName.lastIndexOf("."));
		String uuid=UUID.randomUUID().toString();
		 FileUtils.copyInputStreamToFile(file.getInputStream(), new File("E:/"+uuid+suffix));
		return "index";
	}