使用RestTemplate通过访问的url下载文件

已知:公司的现场部署都是使用的阿里云的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);
    }

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RestTemplate 是 Spring 提供的用于访问 Restful 服务的工具类,它提供了多种访问服务的方法,包括发送 GET、POST、PUT、DELETE 等请求。然而,由于 RestTemplate 是基于同步调用的,对于下载文件这样的耗时操作,直接使用 RestTemplate 可能会导致程序阻塞。 为了解决这个问题,可以使用 RestTemplate 的异步调用方式。异步调用可以在发送请求后继续执行其他任务,而不需要等待响应返回,大大提高了程序的并发性能和响应速度。 使用 RestTemplate 异步下载文件的步骤如下: 1. 创建一个 `AsyncRestTemplate` 对象,用于发送异步请求。 ```java AsyncRestTemplate asyncRestTemplate = new AsyncRestTemplate(); ``` 2. 创建一个 `ResponseExtractor` 对象,用于处理返回的响应流,并保存为文件。 ```java ResponseExtractor<ResponseEntity<byte[]>> responseExtractor = asyncRestTemplate.responseEntityExtractor(byte[].class); ``` 3. 发送异步请求,并获取一个 `ListenableFuture` 对象。 ```java ListenableFuture<ResponseEntity<byte[]>> future = asyncRestTemplate.execute(url, HttpMethod.GET, null, responseExtractor); ``` 4. 注册一个回调函数,当响应返回时触发。 ```java future.addCallback(new ListenableFutureCallback<ResponseEntity<byte[]>>() { @Override public void onFailure(Throwable throwable) { // 异常处理 } @Override public void onSuccess(ResponseEntity<byte[]> responseEntity) { // 获取响应的字节数组 byte[] data = responseEntity.getBody(); // 保存为文件 // ... } }); ``` 上述代码中的 `url` 是要下载文件的地址,`asyncRestTemplate.execute` 方法会返回一个 `ListenableFuture` 对象,通过该对象可以注册回调函数,在回调函数中处理响应的字节数组并保存为文件。 总结:使用 RestTemplate 下载文件时,可以使用异步调用的方式,通过 `AsyncRestTemplate` 发送异步请求,并注册回调函数处理响应。这样可以避免因为大文件下载而导致程序阻塞的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值