OSS 阿里云OSS对象存储简介及简单上传

OSS是一种分布式文件存储的一个不错选择,对象存储服务(Object Storage Service,OSS)是一种海量、安全、低成本、高可靠的云存储服务,适合存放任意类型的文件。

获取accessKeyId和AccessKeySecret

OSS 阿里云OSS对象存储简介及简单上传_第1张图片

AccessKey用于程序方式调用云服务API,通常由AccessKeyId和AccessKeySecret这两个组成部分。AccessKeyId用于标识用户,AccessKeySecret用于验证用户的秘钥。

申请阿里OSS,创建Bucket

oss是收费的,每个bucket是一个存储空间,可以根据不同的项目创建不同的Bucket。

OSS 阿里云OSS对象存储简介及简单上传_第2张图片

 OSS 阿里云OSS对象存储简介及简单上传_第3张图片

OSS 阿里云OSS对象存储简介及简单上传_第4张图片

这个AccessKey账号,需要添加如下几个权限

一、入门示例 - 基于SpringBoot

官方文档:OSS - Java SDK官网文档地址

1、引入pom依赖





com.aliyun.oss

aliyun-sdk-oss

3.8.0

2、配置文件 - application.properties

# EndPoint

aliyun.oss.file.endpoint=xxxx

# KeyId

aliyun.oss.file.keyid=xxxx

# KeySecret

aliyun.oss.file.keysecret=xxxx

# bucketName

aliyun.oss.file.bucketname=xxxx

# 访问图片的固定前缀

aliyun.oss.file.httpsprefix=xxxx

# 最大上传单个文件大小:默认1M

spring.servlet.multipart.max-file-size=1024MB

# 最大置总上传的数据大小 :默认10M

spring.servlet.multipart.max-request-size=1024MB

endPoint在哪找?如图:

OSS 阿里云OSS对象存储简介及简单上传_第5张图片

httpsprefix访问前缀是什么?

  1. 比如:

  2. https://jiuyue.oss-cn-chengdu.aliyuncs.com

  3. jiuyue就是bucketName

  4. 后面那个就是endpoint

3、创建一个工具类 - 主要用于读取配置文件里的bucketName和固定前缀

@Component

public class OssConstant implements InitializingBean {

/** 从配置文件中读取bucketName */

@Value("${aliyun.oss.file.bucketname}")

private String bucketName;

/** 从配置文件中读取存储文件的地址前缀 */

@Value("${aliyun.oss.file.httpsprefix}")

private String ossHttpsPrefix;


public static String BUCKET_NAME;

public static String OSS_HTTPS_PREFIX;


@Override

public void afterPropertiesSet() throws Exception {

BUCKET_NAME = bucketName;

OSS_HTTPS_PREFIX = ossHttpsPrefix;

}


}

4、创建一个配置类,主要是配置OSSClient,方便注入

@Configuration

public class OssConfig {

/** 从配置文件中读取endPoint */

@Value("${aliyun.oss.file.endpoint}")

private String ossEndpoint;

/** 从配置文件中读取KeyId */

@Value("${aliyun.oss.file.keyid}")

private String keyId;

/** 从配置文件中读取KeySecret */

@Value("${aliyun.oss.file.keysecret}")

private String keySecret;


@Bean

public OSSClient ossClient(){

return (OSSClient) new OSSClientBuilder().build(ossEndpoint, keyId, keySecret);

}

}

5、创建一个Controller - 主要功能是上传、删除/批量删除图片、查询图片是否存在

更多api请见官方文档:OSS - Java SDK 官方文档

@RestController

@RequestMapping("/oss")

public class OssController {

@Autowired

private OSSClient ossClient;


/**

* 上传图片到OSS

* @param file 图片文件

* @return 图片访问地址

*/

@PostMapping("/upload")

public String ossUpload(MultipartFile file){

// 获取原始文件名(我一般都是用UUID生成新的文件名)

String fileName = file.getOriginalFilename();

// 文件夹名(可以用模块名)

String folder = "liuchengyin";

// 文件夹名(根据日期来存储)

String format = new SimpleDateFormat("yyyy-MM-dd").format(new Date());

// 文件名 - 使用UUID生成

String fileNameUUID = UUID.randomUUID().toString().replaceAll("-", "");

if (fileName != null){

// 获取原始文件名的后缀,如.jpg .png

fileNameUUID = folder+ "/" + format + "/" + fileNameUUID + fileName.substring(fileName.lastIndexOf("."));

} else {

// 一般来说这种情况是不存在的

fileNameUUID = folder+ "/" + format + "/" + fileNameUUID + ".jpg";

}

try {

ossClient.putObject(OssConstant.BUCKET_NAME, fileNameUUID, file.getInputStream());

} catch (IOException e) {

e.printStackTrace();

}

// 返回文件访问地址 - 这里可以封装一个对象,返回访问地址和文件名(也就是fileNameUUID)

// 这个文件名(fileNameUUID)可以用于查询是否存在、删除等操作

return OssConstant.OSS_HTTPS_PREFIX + "/" + fileNameUUID;

}


/**

* 删除OSS里的文件/文件夹(文件夹内不能有文件)

* @param fileName 文件名 - 完整文件名包括文件夹名,如:liuchengyin/2021-03-23/f624048f7ca8466881f825365e3308d4.jpg

* @return

*/

@PostMapping("/delete")

public String ossDelete(String fileName){

ossClient.deleteObject(OssConstant.BUCKET_NAME, fileName);

return "删除成功!";

}


/**

* 批量删除OSS里的文件

* @param fileNames 文件名集合 - 完整文件名包括文件夹名,如:liuchengyin/2021-03-23/f624048f7ca8466881f825365e3308d4.jpg

* @return

*/

@PostMapping("/deleteBatch")

public List ossDeleteBatch(@RequestBody List fileNames){

DeleteObjectsResult deleteObjectsResult = ossClient.deleteObjects(new DeleteObjectsRequest(OssConstant.BUCKET_NAME).withKeys(fileNames));

// 返回的就是删除成功的图片名集合(图片不存在,也会返回)

return deleteObjectsResult.getDeletedObjects();

}


/**

* 查询OSS里的文件是否存在

* @param fileName 文件名 - 完整文件名包括文件夹名,如:liuchengyin/2021-03-23/f624048f7ca8466881f825365e3308d4.jpg

* @return 是否存在:true or false

*/

@GetMapping("/exist")

public Boolean isExist(String fileName) {

return ossClient.doesObjectExist(OssConstant.BUCKET_NAME, fileName);

}

}

使用postman测试上传文件的方式:

OSS 阿里云OSS对象存储简介及简单上传_第6张图片

Github地址:SpringBoot - OSS对象存储Demo

Gitee地址:SpringBoot - OSS对象存储Demo

二、入门示例 - 基于SMM

这是刚学SSM没多久时写的文章,相当于上面那个不是太完整(懒得删)。

1、引入pom依赖



com.aliyun.oss

aliyun-sdk-oss

3.8.0

2、代码测试

public class FileUpload {

// 上传文件流的方式 - 常用

public static void main(String[] args) throws FileNotFoundException {

// Endpoint以成都为例,其它Region请按实际情况填写。

String endpoint = "http://oss-cn-chengdu.aliyuncs.com";

// 云账号AccessKey有所有API访问权限,建议遵循阿里云安全最佳实践,创建并使用RAM子账号进行API访问或日常运维

String accessKeyId = "Xxxxxx";

String accessKeySecret = "Aaaaaaaa";

// 创建OSSClient实例

OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

// 上传文件流 - 文件地址

InputStream inputStream = new FileInputStream("f:\\成果.jpg");

// 存储BucketName、上传到OSS的文件名

ossClient.putObject("liuchengyin", "狗哥.jpg", inputStream);

// 关闭OSSClient

ossClient.shutdown();

}

}

 OSS 阿里云OSS对象存储简介及简单上传_第7张图片

使用Spring管理OSSClient

1、在Spring配置文件中添加如下

















2、上传后端代码示例

@Controller

public class uploadController{

// 注入OSSClient

@Autowired

private OSSClient ossClient;


/**

* 上传图片

* @param file 文件

* @param folder 文件所在文件夹名

*/

@PostMapping("/upload")

public String ossUpload(@RequestParam("file") MultipartFile file,String folder){

// BucketName

String bucketName = "liuchengyin";

// 获取原始的文件名

String fileName = file.getOriginalFilename();

// 使用UUID来处理文件名随机

fileName = folder + "/" + UUID.randomUUID() + file.getOriginalFilename();


try{

ossClient.putObject(bucketName,fileName,file.getInputStream());

}.cathc(Exception e){

e.printStackTrace();

}

// 返回图片地址

return "https://" + bucketName + ".oss-cn-chengdu.aliyuncs.com/" + fileName;

}

}

OSS 阿里云OSS对象存储简介及简单上传_第8张图片

综上原链接: SpringBoot - 阿里云OSS对象存储简介及简单上传_江南烟雨却痴缠丶-CSDN博客

参考连接:基于springboot框架做oss文件上传功能具体实现_小白划水的博客-CSDN博客_springboot 上传oss

以上为参考,以下为自己编写的测试案例:

1.引入.pom


    com.aliyun.oss
    aliyun-sdk-oss
    3.10.2

2.java 代码

package com.safe.smartsite.base.controller;

import java.io.ByteArrayInputStream;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.safe.common.core.rest.RestResponse;
import org.apache.commons.lang3.RandomUtils;
import org.joda.time.DateTime;
import org.apache.commons.lang.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;

/**
 * @author LAn
 * @date 2022年02月17日 17:19
 */
@RequestMapping("/oss_upload")
@RestController
public class OSSUploadController {
    // 公共云下OSS Region和Endpoint 参照对照表(请求上传连接)
    private static String endpoint = "https://oss-cn-beijing.aliyuncs.com";
    private static String accessKeyId = "秘钥标识ID";
    private static String accessKeySecret = "秘钥";
    // 获取 OSS创建的桶 名称
    private static String bucketName = "oss-sjgr-oa";
    // 上传到 OSS 指定的路径
    private static String objectName = "exampledir/exampleobject.txt";

    // 允许上传的格式
    private static final String[] IMAGE_TYPE = new String[]{".bmp", ".jpg",
            ".jpeg", ".gif", ".png"};

    @RequestMapping(value = "/upload")
    public RestResponse> upload(@RequestParam("file") MultipartFile file) {
        // 校验图片格式
        boolean isLegal = false;
        for (String type : IMAGE_TYPE) {
            if (StringUtils.endsWithIgnoreCase(file.getOriginalFilename(),
                    type)) {
                isLegal = true;
                break;
            }
        }
        if (!isLegal) {
            return null;
        }
        //文件新路径
        String fileName = file.getOriginalFilename();
        String filePath = getFilePath(fileName);
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        // 上传到阿里云
        try {
            ossClient.putObject(bucketName, filePath, new ByteArrayInputStream(file.getBytes()));
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("上传失败<<<<<<<<<<<<<<<<");
            //上传失败
            return null;
        }
        System.out.println("上传成功!!!!");
        //this.aliyunConfig.getUrlPrefix() + filePath 文件路径需要保存到数据库
        return null;
    }
    /**
     *  通过源文件获取 路径和文件名
     * @param sourceFileName
     * @return
     */
    private String getFilePath(String sourceFileName) {
        DateTime dateTime = new DateTime();
        return "images/" + dateTime.toString("yyyy")
                + "/" + dateTime.toString("MM") + "/"
                + dateTime.toString("dd") + "/" + System.currentTimeMillis() +
                RandomUtils.nextInt(100, 9999) + "." +
                StringUtils.substringAfterLast(sourceFileName, ".");
    }


}

3. 采坑 报如下错误可尝试引入以下配置:

java.lang.NoClassDefFoundError: org/apache/http/ssl/TrustStrategy 错误解决办法 引入pom文件


  org.apache.httpcomponents
     httpclient
     4.5.5


     org.apache.httpcomponents
     httpcore
     4.4.5

你可能感兴趣的:(阿里云,java,开发语言,后端)