【SpringMvc】的文件上传和下载
程序员文章站
2022-05-30 20:47:32
...
1.文件上传
SpringMVC为文件上传提供了直接的支持,这种支持是通过即插即用的multipartResolver实现的。Spring使用Jakarta Commons FileUpload 技术实现了一个multipartResolver实现类:CommonsMultipartResolver。SpringMVC上下文中默认没有装配multipartResolver,因此默认情况下不能处理文件的上传工作。如果想使用文件上传功能,需要先在上下文中配置multipartResolver。除此之外,必须将表单的method设置为POST,并将enctype设置为multipart/form-data。 一旦设置了enctype为multipart/form-data,浏览器即会采用二进制流的方式来处理表单数据,选择的文件以二进制数据发送给服务器。
1.1需要导入的jar
为了让CommonsMultipartResolver能正常工作,必须先将commons-io-1.3.2.jar、commons-fileupload-1.3.jar添加到类路径下。1.2开启文件上传,配置springmvc.xml
<!-- 配置支持文件上传类:文件上传解析器 -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="utf-8" /><!-- 请求的编码格式,默认ISO-8859-1 -->
<property name="maxUploadSize" value="10485760" /><!-- 上传文件大小上限,单位为字节(10M) -->
<property name="maxInMemorySize" value="40960" /><!-- 内存中的最大值 -->
<!-- <property name="uploadTempDir" value="upload/image" /> --><!-- 上传文件的临时路径 -->
</bean>
defaultEncoding必须和用户JSP的pageEncoding属性一致,以便正确读取表单的内容。
uploadTempDir是文件上传过程所使用的临时目录,文件上传完成后,临时目录中的临时文件会被自动清除。
- 1.3代码实现
前端upload.jsp内容:
<body>
<form action="${pageContext.request.contextPath}/upload" method="post"
enctype="multipart/form-data">
<h2>文件上传</h2>
文件:<input type="file" name="uploadFile"/><br>
<input type="submit" value="上传">
</form>
</body>
//文件上传Controller
@RequestMapping(value = "upload",method=RequestMethod.POST)
public String upload(@RequestParam("uploadFile") MultipartFile uploadFile,HttpSession session){
//@RequestParam("uploadFile") MultipartFile uploadFile:上传的文件自动绑定到MultipartFile中
try {
if(!uploadFile.isEmpty()){
//获取文件名作为保存到服务器的文件名称
String filename = uploadFile.getOriginalFilename();
if(filename.endsWith("jpg") || filename.endsWith("gif")
|| filename.endsWith("png")){
//文件名称在服务器有可能重复
String newFileName="";
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
newFileName = sdf.format(new Date());
Random r = new Random();
for(int i =0 ;i<3;i++){
newFileName=newFileName+r.nextInt(10);
}
String suffix = filename.substring(filename.lastIndexOf("."));
//前半部分路径,目录,将webRoot下一个名称为images文件夹转换成绝对路径
String leftPath = session.getServletContext().getRealPath("/image");
//进行路径拼接=前半部分路径+文件名称
File file = new File(leftPath,newFileName+suffix);
//如果目录不存在,创建目录
if(!file.getParentFile().exists()){
file.getParentFile().mkdirs();
}
uploadFile.transferTo(file);
}
}
} catch (IllegalStateException | IOException e) {
e.printStackTrace();
}
return "success";
}
springmvc会将上传文件绑定到MultipartFile对象中,MultipartFile提供了获取上传文件内容、文件名等内容,通过其transferTo()方法还可以将文件存储到硬件中,具体说明如下:
byte[] bytes = uploadFile.getBytes();//获取文件数据
String contentType = uploadFile.getContentType();//获取文件MIME类型,如image/pjpeg、text/plain等
InputStream inputStream = uploadFile.getInputStream();//获取文件流
String name = uploadFile.getName();//获取表单中文件组件的名字
String originalFilename = uploadFile.getOriginalFilename();//获取上传文件的原名
long size = uploadFile.getSize();//获取文件的字节大小,单位为byte
boolean flag = uploadFile.isEmpty();//是否有上传文件
uploadFile.transferTo(File dest);//可以使用该文件将上传文件保存到一个目标文件中
实现效果:
- 1.4多文件上传
前端upload.jsp内容:
<form action="${pageContext.request.contextPath}/uploadMore" method="post"
enctype="multipart/form-data">
<h2>多文件上传</h2>
文件:<input type="file" name="uploadFile"/><br>
文件:<input type="file" name="uploadFile"/><br>
文件:<input type="file" name="uploadFile"/><br>
<input type="submit" value="上传">
</form>
//多文件上传Controller
@RequestMapping(value = "uploadMore",method=RequestMethod.POST)
public String uploadMore(@RequestParam MultipartFile[] uploadFile,HttpSession session){
try {
for(MultipartFile item : uploadFile){
if(item.getSize()>0){
//获取文件名作为保存到服务器的文件名称
String filename = item.getOriginalFilename();
if(filename.endsWith("jpg") || filename.endsWith("gif")
|| filename.endsWith("png")){
//前半部分路径,目录,将webRoot下一个名称为images文件夹转换成绝对路径
String leftPath = session.getServletContext().getRealPath("/image");
//进行路径拼接=前半部分路径+文件名称
File file = new File(leftPath,filename);
item.transferTo(file);
}
}
}
} catch (IllegalStateException | IOException e) {
e.printStackTrace();
}
return "success";
}
实现效果:
2.文件下载
前端download.jsp内容:
<h2>文件下载</h2>
<a href="download">download</a>
//文件下载Controller
@RequestMapping(value = "download",method=RequestMethod.GET)
public ResponseEntity<byte[]> download(HttpSession session){
ResponseEntity<byte[]> response =null;
try {
byte[] body=null;
ServletContext servletContext = session.getServletContext();
InputStream in = servletContext.getResourceAsStream("/image/4.png");
body = new byte[in.available()];
in.read(body);
HttpHeaders headers = new HttpHeaders();
//响应头的名字和响应头的值
headers.add("Content-Disposition", "attachment;filename=1.png");
HttpStatus status = HttpStatus.OK;
response = new ResponseEntity<byte[]>(body,headers,status);
} catch (IllegalStateException | IOException e) {
e.printStackTrace();
}
return response;
}
实现效果:
这边使用SpringMvc实现的文件上传和下载比较简单,实际项目中考虑的问题比较多,有兴趣的可以深入研究,写的不好之处请指点。
上一篇: 自定义jsp标签案例
下一篇: 是时候用用二十多年没用的第三条腿了
推荐阅读
-
Python实现多线程下载文件的代码实例
-
Java web Filter, Strurs2 Interceptor 和 SpringMVC Interceptor 三者之间的联系与区别
-
文件上传的时候指定路径中的./和/和../的区别
-
php使用ereg验证文件上传的方法,_PHP教程
-
javascript - 微信最新的js_sdk录音下载下来的speex文件怎么解析
-
突破php上传文件大小限制的配置方法
-
Yii2使用自带的UploadedFile实现的文件上传
-
php获取远程文件的内容和大小,
-
使用perl上传文件到S3,并设置http的header
-
windows下面php5.2.17和php5.3.18和php5.4.8各个版本的imagick组件下载