0
点赞
收藏
分享

微信扫一扫

阿里云之对象存储OSS

东林梁 2022-01-17 阅读 100

阿里云之对象存储OSS

引入依赖

<dependency>
    <groupId>com.aliyun.oss</groupId>
    <artifactId>aliyun-sdk-oss</artifactId>
    <version>3.10.2</version>
</dependency>

初始化

    private static OSS initOSS(){
        // Endpoint以杭州为例,其它Region请按实际情况填写。
        String endpoint = "https://oss-cn-chengdu.aliyuncs.com";
        // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录RAM控制台创建RAM账号。
        String accessKeyId = "LTAI4GJsHGGQGoeFdZjg69aY";
        String accessKeySecret = "94dnIJHDBO5YlrFshWhHvsGlhpkpdv";

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

        return ossClient;
    }

文件上传

  public static void main(String[] args) {
        uploadFile();
    }
    private static void uploadFile(){
    	//指定存储空间(bucketName)
        String bucketName = "bar-app";

        FileInputStream fileInputStream=null;
        try {
            fileInputStream = new FileInputStream("D:\\1.jpg");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

		//初始化
        OSS ossClient = initOSS();
        
        //上传文件到指定的存储空间(bucketName)并将其保存为指定的文件名称(test.png)
        ossClient.putObject(bucketName,"test.png",fileInputStream);

        // 关闭OSSClient。
        ossClient.shutdown();
    }

下载文件

    public static void main(String[] args) {
        //uploadFile();
        downloadFile();
    }
    private static void downloadFile(){
        //指定存储空间(bucketName)
        String bucketName = "bar-app";
        //指定下载文件名Path,默认根目录
        String fileName = "test.png";

        //初始化
        OSS ossClient = initOSS();


        // 下载Object到本地文件,并保存到指定的本地路径中。如果指定的本地文件存在会覆盖,不存在则新建。
        // 如果未指定本地路径,则下载后的文件默认保存到示例程序所属项目对应本地路径中。
        ossClient.getObject(new GetObjectRequest(bucketName, fileName), new File("D:\\2.jpg"));

        // 关闭OSSClient。
        ossClient.shutdown();
    }

文件管理

判断文件是否存在

// 判断文件是否存在。doesObjectExist还有一个参数isOnlyInOSS,如果为true则忽略302重定向或镜像;如果false,则考虑302重定向或镜像。
boolean found = ossClient.doesObjectExist("<yourBucketName>", "<yourObjectName>");

管理文件访问权限

文件的访问权限优先级高于存储空间的访问权限。

文件的访问权限有以下四种:

访问权限描述访问权限值
继承Bucket文件遵循存储空间的访问权限。CannedAccessControlList.Default
私有文件的拥有者和授权用户有该文件的读写权限,其他用户没有权限操作该文件。CannedAccessControlList.Private
公共读文件的拥有者和授权用户有该文件的读写权限,其他用户只有文件的读权限。请谨慎使用该权限。CannedAccessControlList.PublicRead
公共读写所有用户都有该文件的读写权限。请谨慎使用该权限。CannedAccessControlList.PublicReadWrite

1.设置文件访问权限

// 设置文件的访问权限为公共读。
ossClient.setObjectAcl("<yourBucketName>", "<yourObjectName>", CannedAccessControlList.PublicRead);

2.获取文件访问权限

// 获取文件的访问权限。
ObjectAcl objectAcl = ossClient.getObjectAcl("<yourBucketName>", "<yourObjectName>");
System.out.println(objectAcl.getPermission().toString());

删除文件

1.删除单个文件

// 删除文件。如需删除文件夹,请将ObjectName设置为对应的文件夹名称。如果文件夹非空,则需要将文件夹下的所有object删除后才能删除该文件夹。
ossClient.deleteObject(bucketName, objectName);

2.删除多个文件

每次最多删除1000个文件。有两种返回模式:

详细(verbose)模式:返回删除成功的文件列表。默认为详细模式。

简单(quiet)模式:返回删除失败的文件列表。

DeleteObjectsRequest的参数如下:

参数描述方法
Keys需要删除的文件。setKeys(List)
quiet返回模式。true表示简单模式,false表示详细模式。默认为详细模式。setQuiet(boolean)
encodingType对返回的文件名称进行编码。编码类型目前仅支持url。setEncodingType(String)

DeleteObjectsResult的参数如下:

参数描述方法
deletedObjects删除结果。详细模式下为删除成功的文件列表,简单模式下为删除失败的文件列表。List getDeletedObjects()
encodingTypedeletedObjects中文件名称的编码,为空表示没有编码。getEncodingType()

// 删除文件。key等同于ObjectName,表示删除OSS文件时需要指定包含文件后缀在内的完整路径,例如abc/efg/123.jpg。
List<String> keys = new ArrayList<String>();
keys.add("key0");
keys.add("key1");
keys.add("key2");

DeleteObjectsResult deleteObjectsResult = ossClient.deleteObjects(new DeleteObjectsRequest(bucketName).withKeys(keys));
List<String> deletedObjects = deleteObjectsResult.getDeletedObjects();

追加上传

# oss
oss.accessKeyId=LTAI5tQxPchWFZdGYxP5r7CR
oss.accessKeySecret=3wgedYKtRZBd2OzyJOl5bZkGQwfV86
oss.endpoint=http://oss-cn-shenzhen.aliyuncs.com
oss.domain=http://cj-books.oss-cn-shenzhen.aliyuncs.com/
oss.bucket=cj-books
@RestController
@RequestMapping("/file")
public class OssController {

    @Resource
    private IFileService fileService;

    @PostMapping("/oss-append")
    public HashMap fileUpload(@RequestBody JSONObject jsonObject) throws Exception {
        return fileService.ossUpload(jsonObject);
    }
}
@Service
public class FileServiceImpl implements IFileService {

    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    @Value("${oss.accessKeyId}")
    private String accessKeyId;

    @Value("${oss.accessKeySecret}")
    private String accessKeySecret;

    @Value("${oss.endpoint}")
    private String endpoint;

    @Value("${oss.bucket}")
    private String bucket;

    @Value("${oss.domain}")
    private String ossDomain;

    @Autowired
    private FileMapper fileMapper;

   @Override
    public HashMap ossUpload(JSONObject jsonObject) throws IOException {
        logger.info("上传文件开始....");
        String key = jsonObject.getString("key");
        String suffix = jsonObject.getString("suffix");
        String shardBase64 = jsonObject.getString("shard");
        Integer shardIndex = jsonObject.getInteger("shardIndex");
        Integer shardTotal = jsonObject.getInteger("shardTotal");
        Long size = jsonObject.getLong("size");
        String name = jsonObject.getString("name");
        Long shardSize = jsonObject.getLong("shardSize");
        MultipartFile shard = Base64ToMultipartFile.base64ToMultipart(shardBase64);

        ZdFile zdFile = new ZdFile();
        zdFile.setFileKey(key);
        zdFile.setSuffix(suffix);
        zdFile.setShardIndex(shardIndex);
        zdFile.setShardTotal(shardTotal);
        zdFile.setSize(size);
        zdFile.setName(name);
        zdFile.setShardSize(shardSize);

        String dir = LocalDate.now().toString();
        // 2021-07-20/211772d095215cd0a88e4035341d88ea.png
        String path = new StringBuffer(dir).append("/").append(key).append(".").append(suffix).toString();


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

        ObjectMetadata meta = new ObjectMetadata();
        // 指定上传的内容类型。
        meta.setContentType("text/plain");

        // 通过AppendObjectRequest设置多个参数。
        AppendObjectRequest appendObjectRequest = new AppendObjectRequest(bucket, path, new ByteArrayInputStream(shard.getBytes()), meta);

        // 通过AppendObjectRequest设置单个参数。
        // 设置存储空间名称。
        //appendObjectRequest.setBucketName("<yourBucketName>");
        // 设置文件名称。
        //appendObjectRequest.setKey("<yourObjectName>");
        // 设置待追加的内容。有两种可选类型:InputStream类型和File类型。这里为InputStream类型。
        //appendObjectRequest.setInputStream(new ByteArrayInputStream(content1.getBytes()));
        // 设置待追加的内容。有两种可选类型:InputStream类型和File类型。这里为File类型。
        //appendObjectRequest.setFile(new File("<yourLocalFile>"));
        // 指定文件的元信息,第一次追加时有效。
        //appendObjectRequest.setMetadata(meta);

        // 设置文件的追加位置。
        appendObjectRequest.setPosition(((shardIndex - 1) * shardSize));
        ossClient.appendObject(appendObjectRequest);

        // 关闭OSSClient。
        ossClient.shutdown();

        zdFile.setPath(path);
        QueryWrapper<ZdFile> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("file_key", zdFile.getFileKey());
        ZdFile selectOne = fileMapper.selectOne(queryWrapper);
        if (selectOne != null) {
            selectOne.setShardIndex(shardIndex);
            fileMapper.updateById(selectOne);
        } else {
            fileMapper.insert(zdFile);
        }

        zdFile.setPath(ossDomain + path);

        return  BaseUtil.back(1, zdFile);
    }

}
举报

相关推荐

0 条评论