Java操作阿里云OSS对象存储

前言

Java学习路线个人总结-博客
❤欢迎点赞👍收藏⭐留言 📝分享给需要的小伙伴

阿里云OSS就不多介绍了吧,直接上代码!!!

配置文件

​ accessKeyId、accessKeySecret 找到自己对应的OSS控制台,然后去查看自己对应的参数
在这里插入图片描述

##阿里云对象存储
oss:
  accessKeyId: xxx
  accessKeySecret: xxx
  #储存桶名称
  bucketName: xxx
@Data
@Component
@ConfigurationProperties(value = "oss")
public class OSSConfig {

    private String accessKeyId;

    private String accessKeySecret;

    private String bucketName;
}

Maven

<!--阿里云OSS-->
<dependency>
    <groupId>com.aliyun.oss</groupId>
    <artifactId>aliyun-sdk-oss</artifactId>
    <version>3.10.2</version>
</dependency>

OSS工具类

工具类提供了,文件、文件流的上传和文件的下载

public class OSSUtil {
    //需要注意的就是endpoint 地址不要填错了,否则会报错要填

    private final static Logger logger = LoggerFactory.getLogger(OSSUtil.class);

    /**
     * @param inputStream 文件输入流
     * @return void
     * @Author z
     * @Description //TODO 上传文件流到OSS
     * @Date 15:12 2020/12/17
     **/
    public static List<Map<String, String>> uploadInputStreamOSS(InputStream inputStream, String FileName) throws FileNotFoundException {
        //获取OSS对象存储配置参数
        OSSConfig ossConfig = SpringContextUtil.getBean(OSSConfig.class);
        // Endpoint以杭州为例,其它Region请按实际情况填写。
        String endpoint = "http://oss-cn-beijing.aliyuncs.com";
        // 云账号AccessKey有所有API访问权限,建议遵循阿里云安全最佳实践,创建并使用RAM子账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建。
        String accessKeyId = ossConfig.getAccessKeyId();
        String accessKeySecret = ossConfig.getAccessKeySecret();
        String bucketName = ossConfig.getBucketName();
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

        List<Map<String, String>> fileNameList = new ArrayList<>();
        Map<String, String> map = new HashMap<>();

        /*
        
        //下面这段代码是创建动态的文件储存桶,可以参考一下>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        
        // 创建CreateBucketRequest对象。
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-mm-dd");
        Date date = new Date();
        //储存桶名称
        String bucketName = simpleDateFormat.format(date);
        CreateBucketRequest createBucketRequest = new CreateBucketRequest(bucketName);
        // 如果创建存储空间的同时需要指定存储类型以及数据容灾类型, 可以参考以下代码。
        // 此处以设置存储空间的存储类型为标准存储为例。
        // createBucketRequest.setStorageClass(StorageClass.Standard);
        // 默认情况下,数据容灾类型为本地冗余存储,即DataRedundancyType.LRS。如果需要设置数据容灾类型为同城冗余存储,请替换为DataRedundancyType.ZRS。
        // createBucketRequest.setDataRedundancyType(DataRedundancyType.ZRS)
        // 创建存储空间。
        ossClient.createBucket(createBucketRequest);*/

        String uniqueFileName = FileNameUtil.getUniqueFileName(FileName);
        ossClient.putObject(bucketName, uniqueFileName, inputStream);
        // 关闭OSSClient。
        ossClient.shutdown();

        map.put(bucketName, FileName);
        fileNameList.add(map);
        return fileNameList;
    }


    /**
     * @param fileList 文件集合
     * @return java.util.List<java.util.Map < java.lang.String, java.lang.String>>
     * @Author z
     * @Description //TODO 上传文件到OSS
     * @Date 15:27 2020/12/17
     **/
    public static List<Map<String, String>> uploadFileOSS(List<File> fileList) throws FileNotFoundException {
        //获取OSS对象存储配置参数
        OSSConfig ossConfig = SpringContextUtil.getBean(OSSConfig.class);
        // Endpoint以杭州为例,其它Region请按实际情况填写。
        String endpoint = "http://oss-cn-beijing.aliyuncs.com";
        // 云账号AccessKey有所有API访问权限,建议遵循阿里云安全最佳实践,创建并使用RAM子账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建。
        String accessKeyId = ossConfig.getAccessKeyId();
        String accessKeySecret = ossConfig.getAccessKeySecret();
        String bucketName = ossConfig.getBucketName();
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

        List<Map<String, String>> fileNameList = new ArrayList<>();
        Map<String, String> map = new HashMap<>();

        // 创建PutObjectRequest对象。
        PutObjectRequest putObjectRequest = null;
        for (File file1 : fileList) {
            //防止文件名重复,_用于切割下载文件可以保证使用原文件名下载
            String uniqueFileName = FileNameUtil.getUniqueFileName(file1.getName());
            putObjectRequest = new PutObjectRequest(bucketName, uniqueFileName, file1);
            map.put(bucketName, uniqueFileName);
        }
        ossClient.putObject(putObjectRequest);
        // 关闭OSSClient。
        ossClient.shutdown();
        fileNameList.add(map);
        return fileNameList;
    }


    /**
     * @param fileName 下载文件名称
     * @return void
     * @Author z
     * @Description //TODO OSS下载文件
     * @Date 15:54 2020/12/17
     **/
    public static void downFileOss(String fileName, String bucketName, HttpServletResponse response) throws IOException {
        BufferedInputStream input = null;
        OutputStream outputStream = null;
        try {
            //获取OSS对象存储配置参数
            OSSConfig ossConfig = SpringContextUtil.getBean(OSSConfig.class);
            // Endpoint以杭州为例,其它Region请按实际情况填写。
            String endpoint = "http://oss-cn-beijing.aliyuncs.com";
            // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
            String accessKeyId = ossConfig.getAccessKeyId();
            String accessKeySecret = ossConfig.getAccessKeySecret();
            /*String bucketName = "<yourBucketName>";
            //<yourObjectName>表示从OSS下载文件时需要指定包含文件后缀在内的完整路径,例如abc/efg/123.jpg。
            String objectName = "<yourObjectName>";*/

            //获取原文件名
            String oldFileName = FileNameUtil.getFileName(fileName);
            response.reset();
            response.setCharacterEncoding("utf-8");
            response.setContentType("application/x-msdownload");
            response.addHeader("Content-Disposition", "attachment;filename=" + new String(oldFileName.getBytes("gb2312"), "ISO8859-1"));

            // 创建OSSClient实例。
            OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

            // ossObject包含文件所在的存储空间名称、文件名称、文件元信息以及一个输入流。
            OSSObject object = ossClient.getObject(bucketName, fileName);
            input = new BufferedInputStream(object.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();
            ossClient.shutdown();
        } catch (IOException ex) {
            ex.printStackTrace();
            logger.error("OSS下載文件:" + fileName + " 错误");
        } finally {
            try {
                if (outputStream != null) {
                    outputStream.close();
                }
                if (input != null) {
                    input.close();
                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                logger.error("流关闭异常");
            }
        }
    }


    /**
     * @param args
     * @return void
     * @Author z
     * @Description //TODO 测试例子
     * @Date 15:10 2020/12/17
     **/
    public static void main(String[] args) throws FileNotFoundException {
        // Endpoint以杭州为例,其它Region请按实际情况填写。
        String endpoint = "http://oss-cn-beijing.aliyuncs.com";
        // 云账号AccessKey有所有API访问权限,建议遵循阿里云安全最佳实践,创建并使用RAM子账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建。
        String accessKeyId = "LTAIyx6jgoLzveaA";
        String accessKeySecret = "xHpCcWHRUmCrhprXQ4EvasBtrtZxLA";
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        // 上传文件流。
        InputStream inputStream = new FileInputStream(new File("C:\\Users\\D\\Desktop\\Java.pdf"));
        PutObjectResult putObjectResult = ossClient.putObject("xx", "Java.pdf", inputStream);
        // 关闭OSSClient。
        ossClient.shutdown();
    }

}

文件名工具类

public class FileNameUtil {
    /**
     * <p>获取文件唯一名字工具类</p>
     *
     * @param fileName 文件名称
     * @return 文件名称
     * @author z
     */
    public static String getUniqueFileName(String fileName) {
        Timestamp d = new Timestamp(System.currentTimeMillis());
        SimpleDateFormat s = new SimpleDateFormat("yyyyMMddHHmmss");
        String time = s.format(d);
        return time + "_" + fileName;
    }

    /**
     * <p>获取到原文件名</p>
     *
     * @param uploadFileName 上传的文件名
     * @return 原文件名
     * @author z
     */
    public static String getFileName(String uploadFileName) {
        String filename = null;
        if (uploadFileName.indexOf(CommonConstant.UNDERLINE) > 0) {
            filename = uploadFileName.substring(uploadFileName.indexOf("_") + 1);
        }
        return filename;
    }

    /**
     * <p>获取文件后缀名</p>
     *
     * @param fileName 文件名称
     * @return 后缀名
     * @author z
     */
    public static String getFileSuffixName(String fileName) {
        String suffixName = null;
        if (!StringUtils.isEmpty(fileName)) {
            suffixName = fileName.substring(fileName.lastIndexOf(".") + 1);
        }
        return suffixName;
    }

    /**
     * <p>文件重命名</p>
     *
     * @param oldPath 旧名字
     * @param newPath 新名字
     * @throws IOException
     * @author z
     */
    public static void renameFile(String oldPath, String newPath) throws IOException {
        File source = new File(oldPath);
        FileInputStream fis = null;
        FileOutputStream fos = null;
        BufferedInputStream bis = null;
        BufferedOutputStream bos = null;
        byte[] ch = new byte[1024];
        int len = 0;
        try {
            //创建流对象
            fis = new FileInputStream(source);
            //创建缓冲流
            bis = new BufferedInputStream(fis);
            fos = new FileOutputStream(new File(newPath));
            bos = new BufferedOutputStream(fos);
            while ((len = bis.read(ch)) != -1) {
                bos.write(ch, 0, len);
            }
            //刷新缓冲区
            bos.flush();
        } catch (IOException e) {
            throw new IOException("", e);
        } finally {
            if (null != fis) {
                fis.close();
            }
            if (null != bis) {
                bis.close();
            }
            if (null != fos) {
                fos.close();
            }
            if (null != bos) {
                bos.close();
            }
            DeleteFileUtil.delete(oldPath);
        }
    }
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冒险的梦想家

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值