解决@PathVariable对于特殊字符截断的问题
概述:
@ResponseBody @RequestMapping(value="/download/{fileName:[a-zA-Z0-9\\.\\-\\_]+}",method=RequestMethod.GET) publicvoiddownloadAmr(HttpServletRequestrequest,HttpServletResponseresponse,@PathVariable("fileName")StringfileName){ response.setContentType("application/octet-stream"); Stringdir=System.getProperty("catalina.home");//获得tomcat所在的工作路径 System.out.println("tomcat路径="+dir); //获取到存储了文件存储位置的filedir.properties文件路径 Stringdir2=dir.substring(0,dir.length())+File.separator+"webapps"+File.separator+"ROOT"+File.separator+fileName; Filefile=newFile(dir2); ByteArrayOutputStreambyteArrayOutputStream=newByteArrayOutputStream(); byte[]buffer=newbyte[1024]; intlen; try{ InputStreaminputStream=newFileInputStream(file); while((len=inputStream.read(buffer))>-1){ byteArrayOutputStream.write(buffer,0,len); } byteArrayOutputStream.flush(); response.getOutputStream().write(byteArrayOutputStream.toByteArray()); }catch(FileNotFoundExceptione){ logger.error("读取文件异常",e); }catch(IOExceptione){ logger.error(e.getMessage(),e); } logger.info("下载进入。。。。。。。。。。。。。。。。。"); }
总结:
1、默认值情况下/download/{fileName},然后@PathVariable("fileName"),
如果路径为/download/1.jpg的话,那么fileName=1而不是1.jpg,问题就是默认对于字符._-相关进行截断了。
2、解决方法就是
{fileName:[a-zA-Z0-9\\.\\-\\_]+}
用正则表达式表示这些字符不能被截断。
补充:Springboot用@PathVariable传参,最后一个参数会丢失小数点后面的部分
当使用@PathVariable传递路径参数时,竟然神奇的发现,后面一位参数的小数点后面部分竟然不见啦,如下代码:
Controller方法注解如下:
@RequestMapping(value="/user/findPassword/{email}",method=RequestMethod.GET,produces="application/json")
我这里是想传递个邮箱过来的,然后就发现了没有邮箱后缀。
百思不得其解,遂百度之,解决方法如下:
@RequestMapping(value="/user/findPassword/{email:.+}",method=RequestMethod.GET,produces="application/json")
在参数后面添加个冒号和一个小数点在加上一个加号:{email:.+}
以上为个人经验,希望能给大家一个参考,也希望大家多多支持毛票票。如有错误或未考虑完全的地方,望不吝赐教。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。