@PathVariable对于特殊字符截断问题

概述:

@ResponseBody
	@RequestMapping(value="/download/{fileName:[a-zA-Z0-9\\.\\-\\_]+}", method = RequestMethod.GET)
	public void downloadAmr( HttpServletRequest request, HttpServletResponse response, @PathVariable("fileName") String fileName) {
		response.setContentType("application/octet-stream");
		String dir = System.getProperty("catalina.home");  //获得tomcat所在的工作路径    
		System.out.println("tomcat路径=" + dir);  
		//获取到存储了文件存储位置的filedir.properties 文件路径  
		String dir2 = dir.substring(0, dir.length()) + File.separator +"webapps" + File.separator + "ROOT"  + File.separator + fileName;  
		File file = new File(dir2);
		ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
		byte[] buffer = new byte[1024];    
		int len;    
		try { 
			InputStream inputStream = new FileInputStream(file);
			while ((len = inputStream.read(buffer)) > -1 ) {    
				byteArrayOutputStream.write(buffer, 0, len);    
			}  
			byteArrayOutputStream.flush();  
			response.getOutputStream().write(byteArrayOutputStream.toByteArray());
		} catch (FileNotFoundException e) {
			logger.error("读取文件异常", e);
		} catch (IOException e) {  
			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\\.\\-\\_]+}  用正则表达式表示这些字符不能被截断。

你可能感兴趣的:(springframework)