@RequestMapping(path = { "/downloadFromArchive" }, method={RequestMethod.GET})
public ResponseEntity<byte[]> downloadFromArchive(HttpServletRequest request, HttpServletResponse response,
@RequestParam(required=false) String id
) throws IOException {
HttpHeaders headers = new HttpHeaders(); //设置http协议头部
if(id==null||id.equals("")){
return null;
}
Archive archive = this.archiveService.get(id);
if(archive==null){
return null;
}
if(archive.getLink().indexOf(".")<0){
response.sendRedirect(archive.getLink());
return null;
}
String extension = archive.getLink().substring(archive.getLink().lastIndexOf("."));
//System.out.println("archive.getTitle()"+archive.getTitle());
//System.out.println("archive.getLink()"+archive.getLink());
String fileName = archive.getTitle()+extension;
//System.out.println("fileName = "+fileName);
//获取文件在服务器上的绝对路径
String filePath = archive.getLink();
//假如路径为阿新制作的下载controller,则执行特殊的操作,filePath会根据阿新的逻辑去获取
Pattern pattern = Pattern.compile(".*\\?archiveId=(.*?)&fileName=(.*)&randomName=(.*)");
Matcher matcher = pattern.matcher(archive.getLink());
if(matcher.find()){
System.out.println("正则匹配成功1");
String archiveId = matcher.group(1);
fileName = matcher.group(2);
String randomName = matcher.group(3);
filePath = "/uploads/archiveFile/"+archiveId+"/"+randomName;
System.out.println("filePath" + filePath);
}
else{
pattern = Pattern.compile(".*\\?archiveId=(.*?)&fileName=(.*)");
matcher = pattern.matcher(archive.getLink());
if(matcher.find()){
System.out.println("正则匹配成功2");
String archiveId = matcher.group(1);
fileName = matcher.group(2);
filePath = "/uploads/archiveFile/"+archiveId+"/"+fileName;
System.out.println("filePath" + filePath);
}else{}
}
File file = new File(this.servletContext.getRealPath("/") + filePath);
if(!file.exists()){
System.out.println("目标下载文件不存在");
ResponseStaticUtil.write(response, "目标下载文件不存在");
return null;
}
//response.sendRedirect(filePath);
//头部设置文件类型
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
//headers.setContentDispositionFormData("attachment", upload.getName());
if(request.getHeader("User-Agent").toUpperCase().indexOf("MSIE") > 0) { //IE浏览器UTF-8
System.out.println("IE浏览器");
headers.setContentDispositionFormData("attachment", fileName);
}/*else if(request.getHeader("User-Agent").contains("Firefox")){ //火狐浏览器
fileName="=?utf-8?b?"+new BASE64Encoder().encode(fileName.getBytes("utf-8"))+"?=";
}*/else{ // 其他浏览器attachment;filename*=utf-8'zh_cn
System.out.println("其他浏览器");
response.setHeader("Content-Disposition", "attachment;fileName="+URLEncoder.encode(fileName,"utf-8")+"");// 重点
}
//返回文件字节数组
/*try {
return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),headers, HttpStatus.CREATED);
} catch (IOException e) {
e.printStackTrace();
return null;
}*/
InputStream in = new FileInputStream(file);
OutputStream out = response.getOutputStream();
byte[] b = new byte[1024];
int length = 0;
while((length = in.read(b)) != -1) {
out.write(b,0,length);
}
in.close();
out.close();
return null;
}
有必要说一下,为什么没有使用FileUtils的readFileToByteArray方法,而是使用原始的out.write,因为前者在移动端中下载文件是不成功的(但奇怪的是在电脑端上却是正常的)。