@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,因为前者在移动端中下载文件是不成功的(但奇怪的是在电脑端上却是正常的)。