今天项目中需要用到url远程下载,由于url中含有文件中文名,导致下载报错,直接上代码
/** 通过url文件地址下载
* @param url url文件地址
* @param filename 文件名
* @param isOnLine true在线打开预览 ,false直接下载
* @param response
* @功能描述 网络文件获取到服务器后,经服务器处理后响应给前端
*/
@ApiOperation("通过url文件地址下载")
@ApiImplicitParams({
@ApiImplicitParam(name="url",value="文件url",required=true,dataType="String"),
@ApiImplicitParam(name="filename",value="生成下载的文件名",required=true,dataType="String"),
@ApiImplicitParam(name="isOnLine",value="true在线打开预览 ,false直接下载",required=true,dataType="boolean")
})
@GetMapping("/netDownLoadNet")
public void netDownLoadNet(String url, String filename, boolean isOnLine, HttpServletResponse response) throws Exception {
//匹配中文表达式,编码替换
String zhPattern = "[\\u4e00-\\u9fa5]";
Pattern p = Pattern.compile(zhPattern);
Matcher m = p.matcher(url);
StringBuffer b = new StringBuffer();
while (m.find()) {
m.appendReplacement(b, URLEncoder.encode(m.group(0), "UTF-8"));
}
m.appendTail(b);
URL urlHttp = new URL(b.toString());
HttpURLConnection conn = (HttpURLConnection)urlHttp.openConnection();
InputStream inputStream = conn.getInputStream();
response.reset();
response.setContentType(conn.getContentType());
if (isOnLine) {
// 在线打开方式 文件名应该编码成UTF-8
response.setHeader("Content-Disposition", "inline; filename=" + URLEncoder.encode(filename, "UTF-8"));
} else {
//纯下载方式 文件名应该编码成UTF-8
response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(filename, "UTF-8"));
}
byte[] buffer = new byte[1024];
int len;
OutputStream outputStream = response.getOutputStream();
while ((len = inputStream.read(buffer)) > 0) {
outputStream.write(buffer, 0, len);
}
outputStream.flush();
inputStream.close();
outputStream.close();
}
前端请求接口后将响应数据存到一个变量中如data,在用 window.open(data)即可,。