需求:再web项目中,可能会出现需要上传文件,如用户注册上传头像,上传照片,或其他资源等
springmvc实现文件上传:
1.导入jar包:
2设置表单:
<!--当表单中存在文件上传时,需要再form表单中添加enctype="multipart/form-data"属性,而且提交方式必须为post请求,不然上传图片等会报错-->
<form action="../file" method="post" enctype="multipart/form-data">
<input type="file" name="img">
<input type="submit">
</form>
3.设置文件上传视图解析器:
<!--配置文件上传视图解析器-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!--设置编码格式-->
<property name="defaultEncoding" value="utf-8"/>
<!--设置文件最大的大小10M-->
<property name="maxInMemorySize" value="#{10*1024*1024}"/>
</bean>
4.上传功能后台:
@Controller
public class FileController {
/*@RequestParam("img) 将前端请求中指定name的数据放入参数中*/
@RequestMapping("/file")
public String file(@RequestParam("img") MultipartFile file, HttpServletRequest request) {
// 获取原始文件名
String trueName = file.getOriginalFilename();
// 设置文件保存的路径:当前项目的下的/static/upload/文件夹下;因为运行时是编译后的文件再tomcat服务器中运行,
// 因此查看是否上传成功需要再class文件中查看
String path = request.getSession().getServletContext().getRealPath("/static/upload/");
// 设置上传文件保存本地的文件名及路径
File file1 = new File(path + trueName);
// 判断当前文件父级文件夹是否存在,如果不存在,就创建文件夹
if (!file1.getParentFile().exists()) {
file1.mkdirs();
}
try {
// 上传文件,核心功能
file.transferTo(file1);
} catch (IOException e) {
e.printStackTrace();
}
return "index";
}
}
一个最简单的上传功能就完成了,不过这种方式并不好,因为如果有多人操作,出现上传文件名相同等问题,会覆盖,因此要生成一个不会重复的文件名:
1.使用时间来设置文件名:
上传后保存路径:
2.使用UUID类:
其他的内容都一样,生成文件名如下:
文件的下载:
1.可以直接前端设置a标签连接文件地址:
右击链接另存就可以下载了;
2.写一个后台控制器:
package com.zs.controller;
import com.sun.xml.internal.messaging.saaj.packaging.mime.internet.MimeUtility;
import org.apache.commons.io.FileUtils;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.net.URLEncoder;
@Controller
public class DownLoadController {
@RequestMapping("/down")
public ResponseEntity<byte[]> download(@RequestParam("filename") String filename, HttpServletRequest request) throws IOException {
String path = request.getSession().getServletContext().getRealPath("/static/upload/");
File file = new File(path + filename);
String encodedFileName = null;
// 获取User-Agent,借此判断是哪儿种类型的浏览器
String header = request.getHeader("User-Agent");
if (header.indexOf("Chrome") > 0)
encodedFileName = URLEncoder.encode(filename, "utf-8").replaceAll("+", "%20");
else
encodedFileName = MimeUtility.encodeWord(filename);
byte[] bytes = FileUtils.readFileToByteArray(file);
HttpHeaders headers = new HttpHeaders();
//设置响应的文档类型:二进制形式
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
//弹出下载窗口,并制定文件名
headers.setContentDispositionFormData("attachment", encodedFileName);
//状态码
HttpStatus httpStatus = HttpStatus.CREATED;
ResponseEntity<byte[]> responseEntity = new ResponseEntity<>(bytes, headers, httpStatus);
return responseEntity;
}
}
前端页面传要下载的图片名:
版权说明
文章采用: 《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权。版权声明:未标注转载均为本站原创,转载时请以链接形式注明文章出处。如有侵权、不妥之处,请联系站长删除。敬请谅解!