现有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);
}
首先觉得这种把路径处理规则放到映射中的逻辑不是太好,完全可以先请求一个路径,然后通过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就能得到 51 和 28
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;
}
}

参考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=
直接读取参数处理不方便吗?
楼上的回答
@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里也是用正则表达式的