Javascript 如何从浏览器获取触发浏览器下载?

Javascript 如何从浏览器获取触发浏览器下载?,javascript,java,spring,csv,fetch-api,Javascript,Java,Spring,Csv,Fetch Api,我正在做一个项目,前端使用Vue.js和Typescript,后端使用JavaSpring 我的java控制器从db中检索给定的报告,然后将其复制到HTML响应中。 我希望通过浏览器下载CSV,因此我在响应中添加了内容处置标题 @GetMapping(“/download”) 公共无效下载CSV(HttpServletRequest响应){ reportr=reportService.findById(85); addHeader(“内容处置”、“附件;文件名=myCSV.csv”); resp

我正在做一个项目,前端使用Vue.jsTypescript,后端使用JavaSpring

我的java控制器从db中检索给定的报告,然后将其复制到HTML响应中。 我希望通过浏览器下载CSV,因此我在响应中添加了内容处置标题

@GetMapping(“/download”)
公共无效下载CSV(HttpServletRequest响应){
reportr=reportService.findById(85);
addHeader(“内容处置”、“附件;文件名=myCSV.csv”);
response.setContentType(“text/csv”);
试一试{
InputStream=新的ByteArrayInputStream(r.getDocument());
copy(stream,response.getOutputStream());
response.flushBuffer();
}捕获(例外e){…}
}
我有两个按钮:一个带有href链接到download()的简单超链接标记,以及一个b按钮(来自bootstrap vue),一旦点击该按钮,就会触发download2()


下载CSV v2
get download():字符串{
返回'http://localhost:8080/download';
}
异步下载2(){
const rHeaders=新标题();
append('Accept','text/csv');
const configInit=RequestInit={
方法:“GET”,
标题:rHeaders
};
试一试{
const res=等待取数('http://localhost:8080/download,configInit);
返回res.text();
}捕获(e){…}
}
现在,如果我单击第一个按钮“下载csv”,浏览器将正确下载csv。javascript控制台打印以下内容:

Resource interpreted as Document but transferred with MIME type text/csv
反应体中没有任何东西

相反,如果我单击第二个按钮“下载csv v2”,下载不会开始,但我在响应正文中有csv

这里介绍了这两种方法在请求头方面的差异

*Header*                   *Download csv*        *Download csv v2*
Sec-Fetch-Dest                document               empty
Sec-Fetch-Mode                navigate               cors
Sec-Fetch-User                   ?1                    -
Upgrade-Insecure-Requests        1                     -
其他标题是相同的。即使我在javascript方法中设置了这些标题,也不可能更改这些标题;它们仍然是一样的。 有什么问题吗? 谢谢。

我通过“模仿”元素的行为找到了解决方案:

这样,它可以正常工作:

async download2(){
const configInit:RequestInit={
方法:“获取”
};
试一试{
待命http://localhost:8080/download,configInit)
.then(response=>response.blob())
.然后(blob=>{
constURL=window.url.createObjectURL(blob);
常量a=document.createElement('a');
a、 style.display='none';
a、 href=url;
a、 下载='report.csv';
文件.正文.附件(a);
a、 单击();
window.URL.revokeObjectURL(URL);
})
}捕获(e){…}

只是一个想法:是什么让你认为响应不同?浏览器的行为不同,但毕竟,单击HTML超链接和启动异步请求(AJAX风格)是完全不同的。你是否真的观察到了(比如,从浏览器的网络检查器中观察到的)响应是否不同?@GPI你说得对,我说得很糟糕。响应基本相同(所有标题都相同),除了一个(第一个)是“文档”类型,另一个是“获取”类型(来自网络检查器)。浏览器的行为发生了变化。我想知道为什么,事实上它们都是GET请求。感谢您的澄清。因此,我建议您完全重新表述您的问题,因为您的问题似乎与浏览器相关,而与后端无关。问题不在于spring/java部分,而在于如何触发br从浏览器下载owser@GPI,谢谢你的建议,我会重新措辞。