spring boot 的路径参数获取问题

现有url路径长这样 : http://127.0.0.1:8080/image/D://测试//100071175850.jpeg_files/15/51_28.jpeg
其中_files,和.jpeg 为固定的格式
其中需要获取参数
1, D://测试//100071175850.jpeg
2, 15
3, 51
4, 28

C++ 可以用 /image/(.*?)files/(\d+)/(\d+)(\d+).jpeg 这种写法来匹配
提问:使用java的spring boot 如何写Controller的value的值@RequestMapping(value = "?", method = RequestMethod.GET)


    @GetMapping("/image/{filePath}/{category}/{subCategory}_{fileId}.jpeg")
    public String getPathValues(@PathVariable("filePath") String filePath, @PathVariable("category") Long category,
                                @PathVariable("subCategory") Long subCategory, @PathVariable("fileId") Long fileId) {
        return String.format("/image/%s/%d/%d_%d.jpeg", filePath, category, subCategory, fileId);

    }
    static {
        //解决URL中包含%2F的问题
        System.setProperty("org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH", "true");
        //解决URL中包含%5C的问题
        System.setProperty("org.apache.catalina.connector.CoyoteAdapter.ALLOW_BACKSLASH", "true");
    }
    public static void main(String[] args) {



        SpringApplication.run(AdminAPIApplication.class);
    }

img

首先觉得这种把路径处理规则放到映射中的逻辑不是太好,完全可以先请求一个路径,然后通过request获取路径中的uri,利用正则或者字符串截取方法进行处理,最后对处理后的路径做重定向或者转发。而且你这种是为了获取图片信息,完全可以写一个接口,名称为getPic,直接传入id后从后台方法把相应的图片信息以流或者路径的方式返回给你

这个不太行呀,通过get方式传参,如果参数存在特殊符号需要先urlencode一下才行,要不然特殊符号会干扰解析过程的

@Controller
@RequestMapping("/")
public class WebController {

    //http://127.0.0.1:8080/image?data=D%3A%2F%2F%E6%B5%8B%E8%AF%95%2F%2F100071175850.jpeg_files%2F15%2F51_28.jpeg
    @RequestMapping("image")
    @ResponseBody
    public Object image(String data) {
        log.info("data:{}",data);
        return "success";
    }
}


@Controller
@RequestMapping("/")
public class WebController {
 
    @RequestMapping("image/**")
    @ResponseBody
    public Object image(HttpServletRequest request) {
        // http://127.0.0.1:8080/image/D://测试//100071175850.jpeg_files/15/51_28.jpeg
        String uri = URLDecoder.decode(request.getRequestURL().toString(), "UTF-8");
        // 得到  D://测试//100071175850.jpeg_files/15/51_28.jpeg
        String after = StringUtils.substringAfterLast(uri, "/image/");
        // 51_28.jpeg, 再截一遍,然后再根据 _ split就能得到 5128
        String str = StringUtils.substringAfterLast(after, "/");
        // D://测试//100071175850.jpeg_files/15
        StringUtils.substringBeforeLast(after, "/");
        // ... 其他的类似,自己慢慢截取吧。StringUtils 用apache.commons.lang3包里面的, 这个过程比较多,其实你也可以用正则表达式来匹配。
        return "success";
    }
}
 

1、首先@RequestMapping(value = "/D://测试//100071175850.jpeg_files/15/51_28.jpeg", method = RequestMethod.GET)是可以匹配到的;其次@RequestMapping也提供了正则表达式,可以满足你的需求
2、我看你的url路径应该是想访问图片吧,理论上访问指定路径的文件应该在代码里用文件服务去实现,而不是通过这种方式实现

看看这个适用不

@RequestMapping(value = "/image/**")
    public String regexUrlPattern(HttpServletRequest request) throws UnsupportedEncodingException {

        Pattern pattern = Pattern.compile(".*?/image/(.*?files)/(\\d+)/(\\d+)_(\\d+).jpeg");
        Matcher matcher = pattern.matcher(request.getRequestURI());
        if (!matcher.matches()) {
            return "参数错误";
        }
        String filePath = URLDecoder.decode(matcher.group(1),"utf-8");
        String num1 = matcher.group(2);
        String num2 = matcher.group(3);
        String num3 = matcher.group(4);

        return String.format("filePath=%s\nnum1=%s\nnum2=%s\nnum3=%s\n", filePath, num1, num2, num3);
    }

http://127.0.0.1:8080/image/D://测试//100071175850.jpeg_files/15/51_28.jpeg
把这一串后面一部分前端传过来的时候使用base64编码,比如编码的地址是
`http://127.0.0.1:8080/image/xxxxxxxx
然后在Controller使用

@RequestMapping(value = "/image/${filename}")
public String regexUrlPattern(HttpServletRequest request, @PathVariable("filename") String filename)

通过这种方式可以获取到xxxxx,然后base64解码,然后就可以愉快的使用你的正则表达式,或者自定义规则获取你想要的部分了。

如有帮助,请采纳,十分感谢!


package com.shp.dev.controller;


import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import java.net.URLDecoder;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

@RestController
public class Test {

    @GetMapping("/test")
    public void test(HttpServletRequest request){
        //获取请求地址
        String requestURI = request.getRequestURI();
        Pattern pattern = Pattern.compile(".*?/image/(.*?files)/(\\d+)/(\\d+)_(\\d+).jpeg");
        Matcher matcher = pattern.matcher(requestURI);
        String filePath = URLDecoder.decode(matcher.group(1));
        System.out.println(filePath);
    }

}

可以采用如下模式,写正则
@RequestMapping(value = "/{name:(?!fonts|oauth|webjars|swagger|images)[a-z][0-9a-z-]{3,31}}/**",method = {RequestMethod.POST, RequestMethod.GET})
public void homePage(HttpServletRequest request, HttpServletResponse response ,@PathVariable String name) {

其实你这个写得没问题
/image/{filePath}/{category}/{subCategory}_{fileId}.jpeg 换成 /image/{filePath}files/{category}/{subCategory}{fileId}.jpeg 试试

可以看下我写的,参考看看


```java
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Testaaa {
    public static void main(String[] args) {
        String urlStr="http://127.0.0.1:8080/image/D://测试//100071175850.jpeg_files/15/51_28.jpeg";
        String a1 = getRegContent("http://127.0.0.1:8080/image/(.*?)_files/(.*?)", urlStr, 1);
        System.out.println(a1);
        String a2 = getRegContent("http://127.0.0.1:8080/image/(.*?)_files/(.*?)/(.*?)\\.(.*?)", urlStr, 2);
        System.out.println(a2);
        String a3 = getRegContent("http://127.0.0.1:8080/image/(.*?)_files/(.*?)/(.*?)_(.*?)\\.(.*?)", urlStr, 3);
        System.out.println(a3);
        String a4 = getRegContent("http://127.0.0.1:8080/image/(.*?)_files/(.*?)/(.*?)_(.*?)\\.(.*?)", urlStr, 4);
        System.out.println(a4);
    }

    public static String getRegContent(String reg,String content,int index){
        Pattern pattern = Pattern.compile(reg);     // 将编译的正则表达式对象赋给pattern
        Matcher matcher = pattern.matcher(content);
        String group="";
        while (matcher.find()){
            group= matcher.group(index);
            //System.out.println(group);
        }
        return group;
    }
}


![img](https://img-mid.csdnimg.cn/release/static/image/mid/ask/290372463056170.png "#left")

参考https://baijiahao.baidu.com/s?id=1674511515714941492&wfr=spider&for=pc&searchword=%E4%BD%BF%E7%94%A8java%E7%9A%84spring%20boot%20%E5%A6%82%E4%BD%95%E5%86%99Controller%E7%9A%84value%E7%9A%84%E5%80%BC@RequestMapping@RequestMapping(value%20=?%ra=card

用参数传,转成Base64
D://测试//100071175850.jpeg_files/15/51_28.jpeg
转base64

RDovL7LiytQvLzEwMDA3MTE3NTg1MC5qcGVnX2ZpbGVzLzE1LzUxXzI4LmpwZWc=

http://127.0.0.1:8080/image?value=RDovL7LiytQvLzEwMDA3MTE3NTg1MC5qcGVnX2ZpbGVzLzE1LzUxXzI4LmpwZWc=
直接读取参数处理不方便吗?

https://blog.csdn.net/qq_38394915/article/details/115622502?spm=1005.2026.3001.5635&utm_medium=distribute.pc_relevant_ask_down.none-task-blog-2~default~OPENSEARCH~Rate-11.pc_feed_download_top3ask&depth_1-utm_source=distribute.pc_relevant_ask_down.none-task-blog-2~default~OPENSEARCH~Rate-11.pc_feed_download_top3ask

楼上的回答
@RequestMapping(value = "/image/**")
public String regexUrlPattern(HttpServletRequest request) throws UnsupportedEncodingException {

    Pattern pattern = Pattern.compile(".*?/image/(.*?files)/(\\d+)/(\\d+)_(\\d+).jpeg");
    Matcher matcher = pattern.matcher(request.getRequestURI());
    if (!matcher.matches()) {
        return "参数错误";
    }
    String filePath = URLDecoder.decode(matcher.group(1),"utf-8");
    String num1 = matcher.group(2);
    String num2 = matcher.group(3);
    String num3 = matcher.group(4);

    return String.format("filePath=%s\nnum1=%s\nnum2=%s\nnum3=%s\n", filePath, num1, num2, num3);
}

java里也是用正则表达式的