美文网首页
OSS 下载文件到本地

OSS 下载文件到本地

作者: _浅墨_ | 来源:发表于2022-05-31 15:38 被阅读0次

    方式一:保存到特定文件

    
        @Value("${oss.accessKeyId}")
        private String accessKeyId;
        @Value("${oss.accessKeySecret}")
        private String accessKeySecret;
        @Value("${oss.bucketName}")
        private String bucketName;
        @Value("${oss.endpoint}")
        private String endpoint;
    
    
        /**
         * 下载 OSS 文件,保存到特定路径
         */
        @RequestMapping("/downloadOSSFile")
        public void downloadOSSFile(){
    
            // Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
            // String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
            // // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
            // String accessKeyId = accessKeyId;
            // String accessKeySecret = "yourAccessKeySecret";
            // // 填写Bucket名称,例如examplebucket。
            // String bucketName = "examplebucket";
            // // 填写不包含Bucket名称在内的Object完整路径,例如testfolder/exampleobject.txt。
            String objectName = "debugging/onlineDebuggingTemplate.docx";
            String pathName = "/Users/changyou/Desktop/test/线上联调申请(模板).docx";
    
            // 创建OSSClient实例。
            OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
    
            try {
                // 下载Object到本地文件,并保存到指定的本地路径中。如果指定的本地文件存在会覆盖,不存在则新建。
                // 如果未指定本地路径,则下载后的文件默认保存到示例程序所属项目对应本地路径中。
                ossClient.getObject(new GetObjectRequest(bucketName, objectName), new File(pathName));
            } catch (OSSException oe) {
                System.out.println("Caught an OSSException, which means your request made it to OSS, "
                        + "but was rejected with an error response for some reason.");
                System.out.println("Error Message:" + oe.getErrorMessage());
                System.out.println("Error Code:" + oe.getErrorCode());
                System.out.println("Request ID:" + oe.getRequestId());
                System.out.println("Host ID:" + oe.getHostId());
            } catch (ClientException ce) {
                System.out.println("Caught an ClientException, which means the client encountered "
                        + "a serious internal problem while trying to communicate with OSS, "
                        + "such as not being able to access the network.");
                System.out.println("Error Message:" + ce.getMessage());
            } finally {
                if (ossClient != null) {
                    ossClient.shutdown();
                }
            }
        }
    
        /**
         * 如果只是将oss文件响应给前端浏览器,可以使用下面的案例
         * @param response
         */
        @RequestMapping("/downloadOSSFileForFrontEnd")
        public void downloadOSSFileForFrontEnd(HttpServletResponse response) {
    
            BufferedInputStream input = null;
            OutputStream outputStream = null;
    
            // 填写不包含Bucket名称在内的Object完整路径,例如testfolder/exampleobject.txt。
            String objectName = "onlineDebugging/onlineDebuggingTemplate.docx";
            String outputFileName = "onlineDebuggingTemplate.docx";
    
            // 创建OSSClient实例。
            OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
    
            OSSObject ossObject = ossClient.getObject(bucketName, objectName);
    
            try {
                response.reset();
                response.setCharacterEncoding("utf-8");
                response.setContentType("application/x-msdownload");
                response.addHeader("Content-Disposition",
                        "attachment;filename=" + new String(outputFileName.getBytes("gb2312"), "ISO8859-1"));
    
                input = new BufferedInputStream(ossObject.getObjectContent());
                byte[] buffBytes = new byte[1024];
                outputStream = response.getOutputStream();
                int read = 0;
                while ((read = input.read(buffBytes)) != -1) {
                    outputStream.write(buffBytes, 0, read);
                }
                outputStream.flush();
                // 数据读取完成后,获取的流必须关闭,否则会造成连接泄漏,导致请求无连接可用,程序无法正常工作。
                ossObject.close();
            } catch (IOException ex) {
                ex.printStackTrace();
            } finally {
                try {
                    if (outputStream != null) {
                        outputStream.close();
                    }
                    if (input != null) {
                        input.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            ossClient.shutdown();
        }
    

    方式二:只是将oss文件响应给前端浏览器

        /**
         * 如果只是将oss文件响应给前端浏览器,可以使用下面的案例
         * @param response
         */
        @RequestMapping("/downloadOSSFileForFrontEnd")
        public void downloadOSSFileForFrontEnd(HttpServletResponse response) {
    
            BufferedInputStream input = null;
            OutputStream outputStream = null;
    
            // 填写不包含Bucket名称在内的Object完整路径,例如testfolder/exampleobject.txt。
            String objectName = "onlineDebugging/onlineDebuggingTemplate.docx";
            String outputFileName = "onlineDebuggingTemplate.docx";
    
            // 创建OSSClient实例。
            OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
    
            OSSObject ossObject = ossClient.getObject(bucketName, objectName);
    
            try {
                response.reset();
                response.setCharacterEncoding("utf-8");
                response.setContentType("application/x-msdownload");
                response.addHeader("Content-Disposition",
                        "attachment;filename=" + new String(outputFileName.getBytes("gb2312"), "ISO8859-1"));
    
                input = new BufferedInputStream(ossObject.getObjectContent());
                byte[] buffBytes = new byte[1024];
                outputStream = response.getOutputStream();
                int read = 0;
                while ((read = input.read(buffBytes)) != -1) {
                    outputStream.write(buffBytes, 0, read);
                }
                outputStream.flush();
                // 数据读取完成后,获取的流必须关闭,否则会造成连接泄漏,导致请求无连接可用,程序无法正常工作。
                ossObject.close();
            } catch (IOException ex) {
                ex.printStackTrace();
            } finally {
                try {
                    if (outputStream != null) {
                        outputStream.close();
                    }
                    if (input != null) {
                        input.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            ossClient.shutdown();
        }
    

    参考:

    1. Java调用阿里云OSS下载文件
    2. OSS 下载到本地文件

    相关文章

      网友评论

          本文标题:OSS 下载文件到本地

          本文链接:https://www.haomeiwen.com/subject/dbmzprtx.html