项目场景:
今天再做博瑞网站下载的时候,使用PathVariable出现了问题。
问题描述:
提供下载的时候,访问地址是localhost:8080/download/A9.zip,但是拿到的fileName只有A9 @GetMapping("download/{fileName}")
@ApiOperation("下载文件,需要传递")
public ResponseEntity downLoadFile(@PathVariable("fileName") String fileName) throws IOException {
System.out.println("fileName"+fileName);
File file = new File(FilePath.path);
String path = FilePath.zip;
File zipFile = new File(file.getAbsolutePath()+path+fileName);
HttpHeaders headers = new HttpHeaders();
//二进制流数据
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
//通知浏览器以attachment(下载方式)下载文件,文件名称为指定名称
headers.setContentDispositionFormData("attachment",fileName);
byte[] bytes = FileUtils.readFileToByteArray(zipFile);
return new ResponseEntity<byte[]>(bytes,headers, HttpStatus.CREATED);
}
原因分析:
Spring MVC默认把点后面的信息当成是文件后缀,这个时候我们就要修改这个默认值,不然就只会介绍点之前的数据
解决方案:
再path值的后面加上了【:.+】,这个【:.+】就是为了说明参数是什么样子的,这里是带上点,当然你也可以写成【:[a-zA-Z0-9.]+】了
@GetMapping("download/{fileName:.+}")
@ApiOperation("下载文件,需要传递")
public ResponseEntity downLoadFile(@PathVariable("fileName") String fileName) throws IOException {
System.out.println("fileName"+fileName);
File file = new File(FilePath.path);
String path = FilePath.zip;
File zipFile = new File(file.getAbsolutePath()+path+fileName);
HttpHeaders headers = new HttpHeaders();
//二进制流数据
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
//通知浏览器以attachment(下载方式)下载文件,文件名称为指定名称
headers.setContentDispositionFormData("attachment",fileName);
byte[] bytes = FileUtils.readFileToByteArray(zipFile);
return new ResponseEntity<byte[]>(bytes,headers, HttpStatus.CREATED);
}