a标签download属性不起作用
首先要明白的是,download属性是HTML5新增的属性,也就是作用在HTML5的基础之上,他可以使a标签的href属性进行下载,如果填写指就会更改你的下载名称,比如:
<a href="/images/a.exe" download>点击下载</a>
上面这段代码会下载a.exe,并采用默认命名
<a href="/images/a.exe" download="b">点击下载</a>
这段代码会将a.exe改名为b.exe下载
需要注意的是,href属性的地址必须是和你前端js非跨域的地址,如果引用的是第三方的网站或者说是前后端分离的项目,调用后台的接口,这时download就会不起作用。
在这种情况下如果你是下载浏览器无法解析的文件,例如.exe,.xlsx..那么浏览器也会自动下载,但是如果你使用浏览器可以解析的文件,比如.txt,.png....浏览器就会采取预览模式,所以无论如何你都无法直接弹出下载框。如下图所示:
<a href="https://www.baidu.com/a.jpg" download>点击下载</a>
无法正常下载a.jpg,会直接预览
<a href="https://www.baidu.com/a.exe" download>点击下载</a>
正常下载a.exe文件
所以如果真的出现上述情况,那么只有一种办法,提示用户进行手动的右键保存。
提供一种解决方案:给a标签增加点击事件
JS代码如下:
//下载文件
function downloadFile(filenamerel) {
var $downForm = $("<form method='get'></form>");
$downForm.attr("action", "后台地址");
var $input = $("<input type='hidden'>");
$input.attr("name","filenamerel");
$input.val(filenamerel);
$downForm.append($input);
$(document.body).append($downForm);
//提交表单,实现下载
$downForm.submit();
}
后台代码实现如下:
@RequestMapping(value = "路径", method = RequestMethod.GET)
public void downloadEdiFile(HttpServletRequest request, HttpServletResponse response) throws IOException {
String filenamerel = request.getParameter("filenamerel");
String fileName = request.getParameter("filename");
//获取文件保存地址
String filePath = 文件基础路径 + filenamerel;
//读取文件
InputStream txtIn = new FileInputStream(new File(filePath));
OutputStream os = response.getOutputStream();
String userAgent = request.getHeader("user-agent").toLowerCase();
if (userAgent.contains("msie") || userAgent.contains("like gecko")) {
// win10 ie edge 浏览器 和其他系统的ie
fileName = URLEncoder.encode(fileName, "UTF-8");
} else {
// 文件名转码
fileName = new String(fileName.getBytes("UTF-8"), "iso-8859-1");
}
response.setContentType("application/octet-stream; charset=UTF-8");
response.setHeader("Content-Disposition", "attachment; filename=" + fileName);// @TODO 下载的文件名称
//文件缓存区
byte[] bytes = new byte[1024];
//判断输入流中的数据是否已经读完的标致
int len = 0;
while ((len = txtIn.read(bytes)) > 0) {
os.write(bytes, 0, len);
}
if (os!=null){
os.close();
}
if (txtIn!=null){
txtIn.close();
}
}
完成如上阶段即可实现点击下载,如果要重命名,在todo处更改名称即可,也可以从前台传递过来。
ps:如果解决了您的问题请帮忙点赞关注一下哦~
感谢 琨璟 指正的错误
如果是网络文件利用下面的方法进行
// 读取文件
InputStream txtIn = new FileInputStream(new File(filePath));
=》 将上述代码更改为下面的代码
// 从网络读取文件
URL url = new URL(filePath);
URLConnection conn = url.openConnection();
InputStream txtIn = conn.getInputStream();