文件的上传和下载
程序员文章站
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";
}