因为公司用的分布式文件系统上传文件后返回的是 http文件路径,当文件是图片是,用a标签下载会直接打开而不是下载,所以找了下怎么通过浏览器下载远程服务器上的图片。网上大部分都是后台代码,现在把前端后台一起整合一下。
@RequestMapping(value = "/core/downloadNet")
public void downloadNet(HttpServletResponse response,HttpServletRequest request,String url) throws MalformedURLException {
String filename="二维码.JPEG";
//获取浏览器用户代理
String agent=request.getHeader("User-Agent");
try {
//根据浏览器不同处理文件名防止中文乱码
if(agent.contains("MSIE")){
filename=URLEncoder.encode(filename,"utf-8");
filename=filename.replace("+"," ");
}else if(agent.contains("Firefox")){
BASE64Encoder base64Encoder=new BASE64Encoder();
filename="=?utf-8?B?"+base64Encoder.encode(filename.getBytes("utf-8"))+"?=";
}else{
filename=URLEncoder.encode(filename,"utf-8");
}
//设置文件头:最后一个参数是设置下载文件名
response.setHeader("Content-Disposition","attachment;filename="+filename);
//设置文件ContentType类型,这样设置,会自动判断下载文件类型
response.setContentType("application/multipart/form-data");
URL fileUrl = new URL(url);
URLConnection conn = fileUrl.openConnection();
ServletOutputStream out = response.getOutputStream();
int BUFFER = 1024*10;
byte data[] = new byte[BUFFER];
BufferedInputStream bis = null;
//获取文件输入流
InputStream fis = conn.getInputStream();
int read;
bis = new BufferedInputStream(fis,BUFFER);
while((read = bis.read(data)) != -1){
out.write(data, 0, read);
}
fis.close();
bis.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
前端要用from表单请求,不能用ajax请求
function dowloadPic(){
//这里就是远程服务器上的文件路径
let urls=$("#qrUrl").attr("src");
var url = "/core/downloadNet.do";
var fileName = "testAjaxDownload.txt";
var form = $("<form></form>").attr("action", url).attr("method", "post");
form.append($("<input></input>").attr("type", "hidden").attr("name", "url").attr("value", urls));
form.appendTo('body').submit().remove();
}