前端使用HTML5的download属性可直接下载文件,但无法修改文件名。本文介绍通过Java后端代理请求,获取文件流后动态设置Content-Disposition头,从而实现前端调用时指定新文件名的完整方案。
前端JS下载与重命名限制
在前端实现文件下载功能,可以直接利用HTML5的<a>标签,并为其添加download属性即可完成基础下载操作。
var a = document.createElement("a");
a.href = "http://XXX.com/audioStream/8a9dbae9d0859e48fc1f590fcf6d4ccc.mp3";
a.download ="test.mp3";
a.click();
然而,若需要在下载过程中对文件进行重命名,仅靠前端JavaScript通常无法直接实现该功能。
为此,可以采用后端代理的方式来解决。具体做法是利用Java后台发起HTTP请求获取目标文件,在返回前端时通过响应头设置文件名,从而将带有新名称的文件流传递给用户。
Java后端代理实现文件重命名
public void downFiles(HttpServletResponse response,String url,String workInfoId,int type){
try{
String prefix = type == 1 ? "wav" : "txt";
url = type == 1 ? url : (url + "?textInfoId="+workInfoId);
HttpEntity entity = Request.Get(url).
execute().returnResponse().getEntity();
byte[] bys = EntityUtils.toByteArray(entity);
//获取作品名称
Works works = this.worksDao.findByWorkId(workInfoId);
String name = (works!=null && StringUtils.isNotBlank(works.getName())) ? works.getName() : Long.toString(new Date().getTime());
response.setHeader("Content-Disposition", "attachment; filename="+ new String(name.getBytes("utf-8"), "ISO-8859-1")+"."+prefix);
OutputStream out = response.getOutputStream();
out.write(bys);
out.close();
}catch (Exception e){
e.printStackTrace();
}
}
上述内容涵盖了前端限制与后端解决方案的核心逻辑,旨在为相关开发需求提供参考。