一、spingboot 设置虚拟文件路径及拦截类
LoginInterceptor 类 参考就可以 里面我写了业务逻辑 包含了JWTUtil 校验了 不要参考我的代码了
@Component
public class LoginInterceptor implements HandlerInterceptor {
@Autowired
private PlatFormRoleAuthService platFormRoleAuthService;
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object o, Exception arg3)
throws Exception {
// TODO Auto-generated method stub
}
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception {
// TODO Auto-generated method stub
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//获取请求的RUi:去除http:localhost:8080这部分剩下的
String uri = request.getRequestURI();
if (HttpMethod.OPTIONS.toString().equals(request.getMethod()) || uri.contains("controllerTypeFile")|| uri.contains("ico")) {
return true;
} else {
String platFormUserId = request.getHeader("platformuserid");
String userId = request.getHeader("userid");
//System.out.println("传递的参数id:" + platFormUserId);
//System.out.println("传递的参数id2:" + userId);
//System.out.println("传递的方法:" + uri);
String token = request.getHeader("token");
//验证token是否存在
if (token != null && token != "" && (platFormUserId != null || userId != null)) {
//System.out.println("接收的token" + token);
//获取token中的userId
Integer jwtUserId = JwtUtil.getAppUID(token);
//System.out.println("获取的userId:" + jwtUserId);
//System.out.println(platFormUserId !=null);
if (null!=platFormUserId &&jwtUserId.toString() == platFormUserId || jwtUserId.toString().equals(platFormUserId)) {
if (uri.indexOf("/mg/") >= 0) {
//查询数据库 校验权限
String authFlag = platFormRoleAuthService.selectAuthFlagByUserIdAndAuthMethod(platFormUserId,uri);
//System.out.println("authFlag:"+authFlag);
if(authFlag!=null &&(authFlag=="1" || authFlag.equals("1"))){
//System.out.println("认证成功");
response.setHeader("Access-Control-Allow-Origin", "*");
return true;
}else{
//System.out.println("认证失败1.1");
response.setHeader("Access-Control-Allow-Origin", "*");
response.getWriter().write("40000");
return false;
}
/*System.out.println("认证成功");
response.setHeader("Access-Control-Allow-Origin", "*");
return true;*/
} else {
System.out.println("认证失败1");
response.setHeader("Access-Control-Allow-Origin", "*");
response.getWriter().write("50000");
return false;
}
} else if (null!=userId &&jwtUserId.toString() == userId || jwtUserId.toString().equals(userId)) {
if (uri.indexOf("/user/") >= 0) {
//System.out.println("认证成功");
response.setHeader("Access-Control-Allow-Origin", "*");
return true;
} else {
System.out.println("认证失败2");
response.setHeader("Access-Control-Allow-Origin", "*");
response.getWriter().write("50000");
return false;
}
} else {
System.out.println("认证失败3");
response.setHeader("Access-Control-Allow-Origin", "*");
response.getWriter().write("50000");
return false;
}
} else{
System.out.println("认证失败4,token为空");
System.out.println("token:"+token);
System.out.println("platFormUserId:"+platFormUserId);
System.out.println("userId:"+userId);
System.out.println("uri:"+uri);
response.setHeader("Access-Control-Allow-Origin", "*");
response.getWriter().write("50000");
return false;
}
}
}
}
//注册拦截器
@Configuration
public class WebAppConfig implements WebMvcConfigurer {
@Bean
public LoginInterceptor getLoginInterceptor(){
return new LoginInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
//注册自己的拦截器并设置拦截的请求路径 拦截的目的是校验请求地址的token值是否合法 可以不做拦截
registry.addInterceptor(getLoginInterceptor()).addPathPatterns("/**")
.excludePathPatterns("/login") //不拦截的,以下的都是不拦截的
.excludePathPatterns("/mg/exportUserList")
.excludePathPatterns("/mg/exportDevList")
.excludePathPatterns("/mg/exportHistoryData")
.excludePathPatterns("/user/exportHistoryData")
.excludePathPatterns("/mg/checkMyAuth")
.excludePathPatterns("/favicon.ico")
.excludePathPatterns("/dd/**");
}
//添加本地路径作为虚拟路径
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/controllerTypeFile/**").addResourceLocations("file:D:/controllerTypeFile/");
}
}
二、上传文件及下载文件
注意: 上传文件成功后返回 返回成功的消息和文件路径 下载文件就比较简单了 request、response 我写在BaseController 也可以写在参数中里面
UploadAndDownloadController 上传下载类
@RestController
public class UploadAndDownloadController extends BaseController {
public static final String filePath="D:\\controllerTypeFile\\";
//上传文件
@RequestMapping(value = "/mg/uploadControllerFile")
@CrossOrigin
public MsgStatus uploadControllerTypeFile(@RequestParam("file") MultipartFile file){
MsgStatus msg;
if(!file.isEmpty() ){
String fileName = file.getOriginalFilename();
/*//查询
UUID uuid = UUID.randomUUID();
int lastIndexOf = fileName.lastIndexOf(".");
//获取文件的后缀名 .jpg
String suffix = fileName.substring(lastIndexOf);
String newFileName = uuid.toString()+suffix;*/
File uploadFile = new File(filePath+fileName);
//不存在目录 创建
File file11 =new File(filePath);
if(!file11.exists()&& !file11 .isDirectory()){
file11.mkdirs();
}
try {
file.transferTo(uploadFile);
msg = new MsgStatus("success","文件上传成功",fileName);
} catch (IOException e) {
msg = new MsgStatus("error","文件上传失败,服务器故障");
}
}else {
msg = new MsgStatus("error","文件不能为空");
}
response.setHeader("Access-Control-Allow-Origin", "*");
return msg;
}
//下载文件
@RequestMapping(value = "/dd/downControllerFile")
public void downControllerFile(String fileName){
response.setCharacterEncoding(request.getCharacterEncoding());
response.setContentType("application/octet-stream");
ServletOutputStream outputStream = null;
FileInputStream inputStream = null;
try {
//接受文件名,读取磁盘对应的文件,创建输入流对象
inputStream = new FileInputStream(filePath+fileName);
//2.获取响应对象的输出流
outputStream = response.getOutputStream();
//3.文件下载文件名的编码使用ISO-08859-1编码
//我们需要将我们UTF-8的 filename转换ISO-8859-1编码
//3.1先将字符串以UTF-8转换成字节数组
byte[] bytes = fileName.getBytes("UTF-8");
//3.2再将字节数组以 ISO-8859-1转换字符串
fileName = new String(bytes, "ISO-8859-1");
//4.响应的内容应该是以附件的形式响应给浏览器(设置响应头)
response.setHeader("Content-Disposition", "attachment;filename="+fileName);
//5.响应文件给浏览器
IOUtils.copy(inputStream, outputStream);
//刷新及关闭连接
response.flushBuffer();
inputStream.close();
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
BaseController
public class BaseController implements ServletContextAware {
protected HttpServletRequest request;
protected HttpServletResponse response;
protected HttpSession session;
protected ServletContext servletContext;
@ModelAttribute
public void setReqAndRes(HttpServletRequest request, HttpServletResponse response){
this.request = request;
this.response = response;
this.session = request.getSession();
}
@Override
public void setServletContext(ServletContext servletContext) {
this.servletContext = servletContext;
}
}
其实还有一种方法 ,如果不做权限检验,下载文件 可以尝试用网络地址直接访问 ,不用通过controller,不过多次尝试发现有一个问题,中文的文件名会报错,英文的没有问题,之前用springmvc 设置tomcat虚拟路径 一直不存在文件名问题 ,搞不懂springboot 为什么会这样