SpringBoot设置虚拟文件路径 及上传文件 下载文件

一、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 为什么会这样

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值