已知:公司的现场部署都是使用的阿里云的oss 文件也是存储在不同的文件存储服务上的 求:文件如何下载?
首先想到的 当然是直接使用前端进行下载
方案1(失败):直接用Blob转url 下载 结论: 能下载成功 但是文件内容似乎没有写进去 贴上代码
const url = window.URL.createObjectURL(new Blob([res.data]));
const link = document.createElement('a');
link.style.display = 'none';
link.href = url;
link.download = url.split('/')[url.split('/').length - 1];
document.body.appendChild(link);
link.click();
方案2(失败):既然没写进去 那就写进去呗 一调试 突然想起 跨域了啊 那这种方法就只有在不跨域的情况下使用了
const a = document.createElement('a');
fetch(url).then(res => res.blob())
.then(blob => {
a.href = URL.createObjectURL(blob);
a.download = url.split('/')[url.split('/').length - 1];
document.body.appendChild(a);
a.click();
});
方案3(成功):哎呀 直接下文件流写不进文件 通过请求的方式又要跨域 作为一个前后端兼备的小菜鸟,还是打算通过后端转一下吧!
这里的url不是访问文件的地址 是我后端的地址
const a = document.createElement('a');
fetch(url).then(res => res.blob())
.then(blob => {
a.href = URL.createObjectURL(blob);
a.download = url.split('/')[url.split('/').length - 1];
document.body.appendChild(a);
a.click();
});
后端使用RestTemplate来吧 注意这里不要使用注入 哪里要用哪里new
public ResponseEntity<byte[]> downFj(String url) {
RestTemplate restTemplate = new RestTemplate();
ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
assert requestAttributes != null;
HttpServletRequest request = requestAttributes.getRequest();
String token = request.getHeader("Authorization");
HttpHeaders headers = new HttpHeaders();
headers.add(AUTHORIZATION, token);
HttpEntity<Resource> httpEntity = new HttpEntity<>(headers);
return restTemplate.exchange(url, HttpMethod.GET,httpEntity, byte[].class);
}