Java-青云对象存储SDK详解

背景

主要是项目中用到青云对象存储存储操作文件,所以把该功能简单梳理一下,以作记录。

功能实现步骤

一)创建springboot项目,项目名为oysept-qingstor,项目结构图如下

二)pom.xml配置文件中内容如下

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.oysept.qingstor</groupId>
  <artifactId>oysept-qingstor</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>
  
  <parent>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-parent</artifactId>
       <version>1.5.9.RELEASE</version>
       <relativePath/>
  </parent>
  
   <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        
        <!-- json处理jar -->
        <dependency>
		    <groupId>com.alibaba</groupId>
		    <artifactId>fastjson</artifactId>
		    <version>1.2.49</version>
		</dependency>
		
		<dependency>
            <groupId>com.yunify</groupId>
            <artifactId>qingstor.sdk.java</artifactId>
            <version>2.2.6</version>
            <exclusions>
                <exclusion>
                    <groupId>com.squareup.okhttp3</groupId>
                    <artifactId>okhttp</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.squareup.okhttp3</groupId>
            <artifactId>okhttp</artifactId>
            <version>3.9.0</version>
        </dependency>
        
    </dependencies>
    
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <mainClass>com.oysept.qingstor.QingStorApplication</mainClass>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
    
</project>

三)logback.xml配置文件内容如下

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>

    <property name="rootPath" value="/app/oysept-qingstor/logs" />
    <property name="baseFile" value="oysept-qingstor"></property>
    <property name="log.root.level" value="INFO"></property>
    
    <!-- 控制台输出日志 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>%X{logthreadId} [%date{yyyy-MM-dd HH:mm:ss.SSS}] %level %logger{36} %line - %msg%n
            </pattern>
        </encoder>
    </appender>

    <!-- 文件输出日志 -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>${rootPath}/${baseFile}.log</File>
        <!-- 日志文件rolling策略 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <FileNamePattern>${rootPath}/${baseFile}_%d{yyyy-MM-dd}.log.gz
            </FileNamePattern>
            <maxHistory>30</maxHistory>
        </rollingPolicy>

        <!-- 日志输出格式 -->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <Pattern>%X{logthreadId} [%date{yyyy-MM-dd HH:mm:ss.SSS}] %level %logger{36} %line - %msg%n
            </Pattern>
        </encoder>
    </appender>

    <appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
        <discardingThreshold>0</discardingThreshold>
        <queueSize>10000</queueSize>
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="FILE" />
    </appender>

    <root level="INFO">
        <appender-ref ref="ASYNC" />
    </root>

</configuration>

四)application.properties配置内容如下

server.port=8080

五)QingStorApplication启动类内容如下

package com.oysept.qingstor;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import com.oysept.qingstor.QingStorApplication;

/**
 * oysept-qingstor项目启动类
 * @author ouyangjun
 */
@SpringBootApplication
public class QingStorApplication {

	public static void main(String[] args) {
		
		SpringApplication.run(QingStorApplication.class, args);
	}

}

六)QingStorUtils工具类内容如下

package com.oysept.qingstor.utils;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.qingstor.sdk.config.EvnContext;
import com.qingstor.sdk.service.QingStor;

/**
 * 
 * @author ouyangjun
 */
public class QingStorUtils {
	
	private final static Logger LOGGER = LoggerFactory.getLogger(QingStorUtils.class);
	
	// 北京3区
	public final static String zone = "pek3b";
	// qy_access_key_id
	private final static String accessKeyId = "";
	// qy_secret_access_key
	private final static String secretAccessKey = "";
	
	private static class QingStorService {
		// 获取对象
		private static QingStor qingStor = getQingStor();
		
		private static QingStor getQingStor() {
			EvnContext evn = new EvnContext(accessKeyId, secretAccessKey);
			QingStor storService = new QingStor(evn, zone);
			
			LOGGER.info("QingStorSingleton,获取QingStor对象!");
			// 返回
			return storService;
		}
	}
	
	/**
	 * 构建QingStor对象
	 * @return
	 */
	public static QingStor getQingStorSingleton() {
		return QingStorService.qingStor;
	}
	
}

七)BucketController接口类内容如下

package com.oysept.qingstor.controller;

import java.io.File;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.oysept.qingstor.utils.QingStorUtils;
import com.qingstor.sdk.exception.QSException;
import com.qingstor.sdk.service.Bucket;
import com.qingstor.sdk.service.QingStor;
import com.qingstor.sdk.service.QingStor.ListBucketsOutput;

/**
 * Bucket Controller
 * @author ouyangjun
 */
@RestController
@RequestMapping(value = "/qingstor")
public class BucketController {
	
	private final static Logger LOGGER = LoggerFactory.getLogger(BucketController.class);
	
	/**
	 * 该系统首页测试接口
	 * @return
	 */
	@RequestMapping(value = "/home", method = RequestMethod.GET)
	public String home(){
		return "oysept qingstor bucket home!";
	}
	
	/**
	 * 青云-获取Bucket列表
	 * 请求地址: http://localhost:8080/qingstor/listBuckets
	 * @return
	 */
	@RequestMapping(value = "/listBuckets", method = RequestMethod.GET)
	public String listBuckets() {
		try {
			// 获取QingStor对象
			QingStor qingstor = QingStorUtils.getQingStorSingleton();
			
			// 获取Bucket列表
			ListBucketsOutput listOutput = qingstor.listBuckets(null);
			
			// 转换成json字符串
			String buckets = JSON.toJSONString(listOutput);
			LOGGER.info("Bucket列表: {}", buckets);
			
			// 返回值
			return buckets;
		} catch (QSException e) {
			LOGGER.info("/listBuckets,获取Bucket列表失败!", e);
		}
		return "List Bucket Error!";
	}
	
	/**
	 * 青云-创建Bucket
	 * 请求地址: http://localhost:8080/qingstor/createBucket
	        参数: {
				"bucketName":"ouyangjun"
			}
	 * @return
	 */
	@RequestMapping(value = "/createBucket", method = RequestMethod.POST)
	public String createBucket(@RequestBody String objJson) {
		LOGGER.info("/createBucket,objJson: {}", objJson);
		if (StringUtils.isEmpty(objJson)) {
			return "objJson is null!";
		}
		try {
			LOGGER.info("/createBucket,创建Bucket步骤-----begin-----");
			// 解析对象
			JSONObject obj = JSONObject.parseObject(objJson);
			if (obj != null && !StringUtils.isEmpty(obj.get("bucketName"))) {
				// 获取对象
				QingStor qingstor = QingStorUtils.getQingStorSingleton();
				
				// 构建对象
				Bucket bucket = qingstor.getBucket(String.valueOf(obj.get("bucketName")), QingStorUtils.zone);
				Bucket.PutBucketOutput putBucketOutput = bucket.put();
				
				LOGGER.info("/createBucket,创建Bucket步骤-----end-----");
				return JSONObject.toJSONString(putBucketOutput);
			}
		} catch (QSException e) {
			LOGGER.info("/createBucket,创建Bucket失败!", e);
		}
		return "Create Bucket Error!";
	}
	
	/**
	 * 获取Bucket中存储的Object列表
	 * 请求地址: http://localhost:8080/qingstor/listObjects
	        参数: {
				"bucketName":"ouyangjun"
			}
	 */
	@RequestMapping(value = "/listObjects", method = RequestMethod.POST)
	public String listObjects(@RequestBody String objJson) {
		LOGGER.info("/listObjects,objJson: {}", objJson);
		if (StringUtils.isEmpty(objJson)) {
			return "objJson is null!";
		}
		try {
			LOGGER.info("/listObjects,获取Bucket Object-----begin-----");
			// 解析对象
			JSONObject obj = JSONObject.parseObject(objJson);
			if (obj != null && !StringUtils.isEmpty(obj.get("bucketName"))) {
				// 获取QingStor对象
				QingStor qingstor = QingStorUtils.getQingStorSingleton();
				
				// 获取Bucket对象
				Bucket bucket = qingstor.getBucket(String.valueOf(obj.get("bucketName")), QingStorUtils.zone);
				// 获取Object对象
				Bucket.ListObjectsOutput listOutput = bucket.listObjects(null);
				
				LOGGER.info("/listObjects,获取Bucket Object-----end-----");
				return JSON.toJSONString(listOutput);
			}
		} catch (QSException e) {
			LOGGER.info("/listObjects,获取Bucket Object列表失败!", e);
		}
		return "List Object Error!";
	}
	
	/**
	 * 删除Bucket中存储的Object列表
	 * 请求地址: http://localhost:8080/qingstor/deleteObject
	        参数: {
				"bucketName":"ouyangjun",
				"objectName":""
			}
	 */
	@RequestMapping(value = "/deleteObject", method = RequestMethod.POST)
	public String deleteObject(@RequestBody String objJson) {
		LOGGER.info("/deleteObject,objJson: {}", objJson);
		if (StringUtils.isEmpty(objJson)) {
			return "objJson is null!";
		}
		try {
			LOGGER.info("/deleteObject,删除Bucket Object-----begin-----");
			// 解析对象
			JSONObject obj = JSONObject.parseObject(objJson);
			if (obj != null && !StringUtils.isEmpty(obj.get("bucketName"))) {
				// 获取QingStor对象
				QingStor qingstor = QingStorUtils.getQingStorSingleton();
				
				// 获取Bucket对象
				Bucket bucket = qingstor.getBucket(String.valueOf(obj.get("bucketName")), QingStorUtils.zone);
				
				// 判断文件名称是否为空
				if (!StringUtils.isEmpty(obj.get("objectName"))) {
					// 获取Object对象(名称是唯一的,不能重复,如果文件不存在,删除就没效果)
					Bucket.DeleteObjectOutput deleteOutput = bucket.deleteObject(String.valueOf(obj.get("objectName")));
					
					LOGGER.info("/deleteObject,删除Bucket Object-----end-----");
					return JSON.toJSONString(deleteOutput);
				}
			}
		} catch (QSException e) {
			LOGGER.info("/deleteObject,删除Bucket Object失败!", e);
		}
		return "Delete Object Error!";
	}
	
	/**
	 * 在指定Bucket下创建一个Object对象
	 * 请求地址: http://localhost:8080/qingstor/createObject
	        参数: {
				"bucketName":"ouyangjun"
			}
	 */
	@RequestMapping(value = "/createObject", method = RequestMethod.POST)
	public String createObject(@RequestBody String objJson) {
		LOGGER.info("/createObject,objJson: {}", objJson);
		if (StringUtils.isEmpty(objJson)) {
			return "objJson is null!";
		}
		try {
			LOGGER.info("/createObject,创建Bucket Object-----begin-----");
			// 解析对象
			JSONObject obj = JSONObject.parseObject(objJson);
			if (obj != null && !StringUtils.isEmpty(obj.get("bucketName"))) {
				// 文件路径
				String fileUrl = "D:\\test.txt";
				File file = new File(fileUrl);
				if(!file.exists()) {
					return fileUrl + " is not exists!";
				}
				
				// 获取QingStor对象
				QingStor qingstor = QingStorUtils.getQingStorSingleton();
				
				// 获取Bucket对象
				Bucket bucket = qingstor.getBucket(String.valueOf(obj.get("bucketName")), QingStorUtils.zone);
				
				// 创建对象
				Bucket.PutObjectInput input = new Bucket.PutObjectInput();
				input.setBodyInputFile(file);
				input.setContentType("text/plain");
				input.setContentLength((Long)file.length());
				Bucket.PutObjectOutput putObjectOutput = bucket.putObject(file.getName(), input);
				
				LOGGER.info("/createObject,创建Bucket Object-----end-----");
				return JSON.toJSONString(putObjectOutput);
			}
		} catch (QSException e) {
			LOGGER.info("/createObject,创建Bucket Object失败!", e);
		}
		return "Create Object Error!";
	}
	
}

本章完结,待续!

源码下载地址: https://gitee.com/ouyangjun_xm/java/attach_files下oysept-qingstor.zip压缩包

                      码云账户: [email protected]     密码: [email protected]

                      请勿恶意操作,谢谢!

本文说明:该文章属于原创,如需转载,请标明文章转载来源

猜你喜欢

转载自blog.csdn.net/p812438109/article/details/82708513