oss直接下载文件到客户端

本文介绍了一种从阿里云OSS直接下载文件至用户端的优化方案,避免了传统方式下服务端作为中转站的低效流程,显著提高了文件传输效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前提需求:支持用户将oss端的文件进行下载使用。

1.最初分析,将oss端的文件下载到服务端 ==》再将服务端的文件提供用户下载 ==》用户下载完成后,删除服务端临时下载文件。

这样做第一、步骤复杂,加大了程序出错的概率。第二、效率低下,做了两次文件传输。

2.设想的最优方案,既然都是流的传输,如果能够实现 oss端的文件 ==》 用户端。

这样做明显比最初的方案,步骤简洁,不易出错,只要做一次传输,效率明显提高。

环境,jdk1.6.0_45。所以下文的资源释放还是最原始的方式。

实现的效果,用户客户端(Web浏览器)直接下载文件,对于其他客户端的下载,处理逻辑是相通的。

 

操作开始:

1.获取oss文件的对象(该对象就能获取其对应的流)。

//OSS client,每个项目封装都不太一样,获取OSSObject就是需要用到该实例
this.client = new OSSClient(OSS_ENDPOINT,ACCESS_ID, ACCESS_KEY);

//通过上面的client、bucket、key获取oss端文件的OSSObject
public OSSObject getOSSObject(String bucket,String key){
        return client.getObject(bucket, key);
    }

2.获取到oss端文件的OSSOBject之后,就可以直接将其进行下载操作了。下面代码核心逻辑用 * * 标注起来了。

public static void downLoadFile(OSSObject ossObject,HttpServletResponse response) throws IOException {
        BufferedInputStream bis = null;
        OutputStream toClient = null;
        try {
            //*获取ossObject的流*
            bis = new BufferedInputStream(ossObject.getObjectContent(),512);

            //获取oss端文件的文件名,用作于下载文件的名称
            String[] arr = ossObject.getKey().split("/");
            String fileName = arr[arr.length - 1];
            
            response.reset();
            toClient = new BufferedOutputStream(response.getOutputStream());
            response.setContentType("application/octet-stream");
            //处理文件名为中文的情况
            response.setHeader("Content-Disposition","attach;filename=" + new String(fileName.getBytes("UTF-8"), "ISO-8859-1"));

            //*处理oss文件流传输*
            int number;
            byte[] buffer = new byte[512];
            while ((number = bis.read(buffer)) != -1){
                toClient.write(buffer,0,number);
            }
            toClient.flush();
            toClient.close();
        }finally {
            if(toClient != null){
                toClient.close();
            }
            if(bis != null){
                bis.close();
            }
        }
    }

 

这样就大功告成了,是不是很简单,小伙伴赶紧去试试吧。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值