当前位置 博文首页 > 谢哥哥的博客:【文件上传】阿里OSS文件存储:Java使用阿里云OSS

    谢哥哥的博客:【文件上传】阿里OSS文件存储:Java使用阿里云OSS

    作者:[db:作者] 时间:2021-07-13 13:14

    阿里云OSS Java SDK

    首先想使用阿里云OSS服务先要去官网申请:阿里云API的密钥AccessKeyID阿里云API的密钥AccessKeySecret 有了这两个才能进行开发。

    阿里云官方有针对不同语言设计的SDK包,本文使用java SDK。博主代码有作修改。
    详细SDK介绍参看官网链接: https://help.aliyun.com/document_detail/oss/sdk/java-sdk/preface.html?spm=5176.383663.13.1.J6I4Ga

    	<!--阿里云OSS-->
    	<!-- https://mvnrepository.com/artifact/com.aliyun.oss/aliyun-sdk-oss -->
    	<dependency>
    	    <groupId>com.aliyun.oss</groupId>
    	    <artifactId>aliyun-sdk-oss</artifactId>
    	    <version>3.9.1</version>
    	</dependency>
    

    创建ossClient

        /**
         * 获取阿里云OSS客户端对象
         *
         * @return ossClient
         */
        public static OSS getOSSClient() {
            ClientBuilderConfiguration conf = new ClientBuilderConfiguration();
            // 连接空闲超时时间,超时则关闭
            conf.setIdleConnectionTime(1000);
    		// 在这里可以做一些配置,比如超时时间、最大连接数之类的
    		···
            return new OSSClientBuilder().build(ENDPOINT, ACCESS_KEY_ID, ACCESS_KEY_SECRET, conf);
        }
    

    创建一个bucket,也就是桶,相当于访问域名前缀部分

        /**
         * 创建桶
         *
         * @param ossClient  OSS连接
         * @param bucketName 桶名称
         * @return
         */
        public static String createBucketName(OSS ossClient, String bucketName) {
            if (!ossClient.doesBucketExist(bucketName)) {
                //创建存储空间
                Bucket bucket = ossClient.createBucket(bucketName);
                log.info("创建存储空间成功");
                return bucket.getName();
            }
            return bucketName;
        }
    

    普通上传完整代码(AliyunOSSClientUtil)

    /**
     * 阿里oss工具类
     *
     * @author xiegege
     * @date 2020-07-23
     */
    @Slf4j
    @Component
    public class AliyunOSSClientUtil {
    
        private static String ENDPOINT;
        private static String ACCESS_KEY_ID;
        private static String ACCESS_KEY_SECRET;
    
        @Value("${aliyunOSS.endpoint}")
        private void setEndpoint(String endpoint) {
            ENDPOINT = endpoint;
        }
    
        @Value("${aliyunOSS.accessKeyId}")
        private void setAccessKeyId(String accessKeyId) {
            ACCESS_KEY_ID = accessKeyId;
        }
    
        @Value("${aliyunOSS.accessKeySecret}")
        private void setAccessKeySecret(String accessKeySecret) {
            ACCESS_KEY_SECRET = accessKeySecret;
        }
    
        /**
         * 获取阿里云OSS客户端对象
         *
         * @return ossClient
         */
        public static OSS getOSSClient() {
            ClientBuilderConfiguration conf = new ClientBuilderConfiguration();
            // 连接空闲超时时间,超时则关闭
            conf.setIdleConnectionTime(1000);
            return new OSSClientBuilder().build(ENDPOINT, ACCESS_KEY_ID, ACCESS_KEY_SECRET, conf);
        }
    
        /**
         * 创建桶
         *
         * @param ossClient  OSS连接
         * @param bucketName 桶名称
         * @return
         */
        public static String createBucketName(OSS ossClient, String bucketName) {
            if (!ossClient.doesBucketExist(bucketName)) {
                //创建存储空间
                Bucket bucket = ossClient.createBucket(bucketName);
                log.info("创建存储空间成功");
                return bucket.getName();
            }
            return bucketName;
        }
    
        /**
         * 删除桶
         *
         * @param ossClient  oss对象
         * @param bucketName 桶名称
         */
        public static void deleteBucket(OSS ossClient, String bucketName) {
            ossClient.deleteBucket(bucketName);
            log.info("删除" + bucketName + "桶成功");
        }
    
        /**
         * 上传图片至OSS 文件流
         *
         * @param ossClient  oss连接
         * @param file       上传文件(文件全路径如:D:\\image\\cake.jpg)
         * @param bucketName 桶名称
         * @param folder     阿里云API的文件夹名称(父文件夹)
         * @param format     阿里云API的文件夹名称(子文件夹)
         * @param formats    文件名
         * @return String 返回的唯一MD5数字签名
         */
        public static String[] uploadObject2OSS(OSS ossClient, File file, String bucketName, String folder, String format, String formats) {
            String[] resultArr = new String[2];
            try {
                // 以输入流的形式上传文件(普通上传)
                folder = folder + format;
                InputStream is = new FileInputStream(file);
                // 文件名
                String fileName = file.getName();
                // 文件扩展名
                String fileExtension = fileName.substring(fileName.lastIndexOf("."));
                // 最终文件名:UUID + 文件扩展名
                fileName = formats + fileExtension;
                // 上传路径 如:appversion/20200723/a3662009-897c-43ea-a6d8-466ab8310c6b.apk
                String path = folder + fileName;
                log.info("上传到路径" + path);
                // 文件大小
                long fileSize = file.length();
                // 创建上传Object的Metadata
                ObjectMetadata metadata = new ObjectMetadata();
                // 上传的文件的长度
                metadata.setContentLength(is.available());
                // 指定该Object被下载时的网页的缓存行为
                metadata.setCacheControl("no-cache");
                // 指定该Object下设置Header
                metadata.setHeader("Pragma", "no-cache");
                // 指定该Object被下载时的内容编码格式
                metadata.setContentEncoding("utf-8");
                // 文件的MIME,定义文件的类型及网页编码,决定浏览器将以什么形式、什么编码读取文件。如果用户没有指定则根据Key或文件名的扩展名生成,
                // 如果没有扩展名则填默认值application/octet-stream
                metadata.setContentType(getContentType(fileExtension));
                // 指定该Object被下载时的名称(指示MINME用户代理如何显示附加的文件,打开或下载,及文件名称)
                metadata.setContentDisposition("filename/filesize=" + fileName + "/" + fileSize + "Byte.");
                // 上传文件 (上传文件流的形式)
                PutObjectResult putResult = ossClient.putObject(bucketName, path, is, metadata);
                // 解析结果
                resultArr[0] = putResult.getETag();
                resultArr[1] = path;
                is.close();
                ossClient.shutdown();
            } catch (Exception e) {
                e.printStackTrace();
                log.error("上传阿里云OSS服务器异常." + e.getMessage(), e);
            } finally {
                // 关闭OSSClient
                ossClient.shutdown();
            }
            return null;
        }
    
        /**
         * 获得url链接
         *
         * @param bucketName 桶名称
         * @param key        Bucket下的文件的路径名+文件名 如:"appversion/20200723/a3662009-897c-43ea-a6d8-466ab8310c6b.apk"
         * @return 图片链接:http://xxxxx.oss-cn-beijing.aliyuncs.com/test/headImage/1546404670068899.jpg?Expires=1861774699&OSSAccessKeyId=****=p%2BuzEEp%2F3JzcHzm%2FtAYA9U5JM4I%3D
         * (Expires=1861774699&OSSAccessKeyId=LTAISWCu15mkrjRw&Signature=p%2BuzEEp%2F3JzcHzm%2FtAYA9U5JM4I%3D 分别为:有前期、keyID、签名)
         */
        public static String getUrl(String bucketName, String key) {
            // 设置URL过期时间为10年  3600L*1000*24*365*10
            Date expiration = new Date(System.currentTimeMillis() + 3600L * 1000 * 24 * 365 * 10);
            OSS ossClient = getOSSClient();
            // 生成URL
            URL url = ossClient.generatePresignedUrl(bucketName, key, expiration);
            return url.toString().substring(0, url.toString().lastIndexOf("?"));
        }
    
        /**
         * 通过文件名判断并获取OSS服务文件上传时文件的contentType
         *
         * @param fileExtension 文件名扩展名
         * @return 文件的contentType
         */
        public static String getContentType(String fileExtension) {
            // 文件的后缀名
            if (".bmp".equalsIgnoreCase(fileExtension)) {
                return "image/bmp";
            }
            if (".gif".equalsIgnoreCase(fileExtension)) {
                return "image/gif";
            }
            if (".jpeg".equalsIgnoreCase(fileExtension) || ".jpg".equalsIgnoreCase(fileExtension)