背景
主要是项目中用到青云对象存储存储操作文件,所以把该功能简单梳理一下,以作记录。
功能实现步骤
一)创建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]
请勿恶意操作,谢谢!
本文说明:该文章属于原创,如需转载,请标明文章转载来源