附件同步到华为云OBS存储备份实践(服务端API应用)
本帖最后由 app转转风 于 2020-3-17 13:28 编辑最近在了解华为云OBS存储,所以就用活字格6做了一个附件同步备份。
本示例只实现了添加同步,修改和删除同步没有做。
另外有关OBS桶的创建、删除的操作示例还在测试中。
还有就是本人对c#编程并不是很熟悉,所以后面的API实现代码写得不是很好,大家可以参考优化。
在开发本示例过程中,如果活字格有如下改进则更好(也许已有只是我不知道而已):
1、服务命令也可以发起POST请求,这样就不用在前端使用javascript命令了,效果更好;
2、数据表操作添加新数据后,能直接获取到新加记录的ID,那就更加方便了。
3、服务端操作数据表时,如果能直接写sql语句,则更好。
4、可以获取一些系统变量(如附件存储目录),或是自定义一些系统变量则更好(如AK值写到系统变量则更加方便获取)?
相关步骤如下。
1、在华为云注册账号并获取AK、SK,详细可见:https://support.huaweicloud.com/api-obs/obs_04_0116.html
2、在OBS控制台创建桶。
3、下载OBS开发SDK,详细见:https://support.huaweicloud.com/ ... bs/obs_25_0001.html
下载最新版。
4、使用vs2019开发服务端api应用,详细可见过个教程:https://help.grapecity.com.cn/pa ... ion?pageId=23594298
要注意,还要把第三步下载的SDK添加到引用中
5、编写API代码,生成dll
6、活字格中上传api
7、开发应用
8、做好配置
9、运行效果
OBS可以看到同步的文件。
示例工程如下:
vs2019的API源代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using GrapeCity.Forguncy.ServerApi;
using OBS;
using OBS.Model;
namespace FileToHuaweiOBS
{
public class FileToHuaweiOBS :ForguncyApi
{
private static string endpoint = "";
private static string AK = "";
private static string SK = "";
private string LocalPath = ""; //本地附件目录
private string defaultObsregion = ""; //默认区域
private string defaultBucketName = ""; //默认桶名
private string obsregion = ""; //区域
private string BucketName = ""; //桶名
private string optype = ""; //操作类型
private string resultCode = "";
private string resultMsg = "";
//日志记录
Dictionary<string, object> LogValues = new Dictionary<string, object>();
public void obsApi()
{
//获取post请求的数据
var form = this.Context.Request.ReadFormAsync().Result;
obsregion = form["obsregion"];
optype = form["optype"];
LogSave("api", "接收到POST", "操作:" + optype);
optype = optype.ToLower();
//预留其他操作扩展
switch (optype)
{
case "fileasync":
BucketName = form["BucketName"];
obsObjectAsync(obsregion, BucketName);
break;
default:
this.resultCode = "1";
this.resultMsg = "操作方法错误";
break;
}
//定义返回结果;
//转换数据类型为string
if (resultCode == "0")
{
string result = Convert.ToString("0");
this.Context.Response.Write(result.ToString());
}
else
{
string result = Convert.ToString("1") + "," + this.resultMsg;
this.Context.Response.Write(result.ToString());
}
}
//OBS授权访问信息
public void obsAuth()
{
//获取默认区域
var data = DataAccess.GetTableData(string.Format("访问配置?$select=配置项值&$filter=配置项索引 eq 'obsregion'")) as List<Dictionary<string, object>>;
if (data.Count != 0)
{
//获取默认区域
defaultObsregion = data["配置项值"].ToString();
//LogSave("OBS", "获取默认区域", defaultObsregion );
}
//获取默认桶
data = DataAccess.GetTableData(string.Format("访问配置?$select=配置项值&$filter=配置项索引 eq 'BucketName'")) as List<Dictionary<string, object>>;
if (data.Count != 0)
{
//获取默认桶
defaultBucketName = data["配置项值"].ToString();
//LogSave("OBS", "获取默认桶", defaultBucketName );
}
if (obsregion == "")
{
obsregion = defaultObsregion;//设置默认区域
}
//获取区域endpoint
data = DataAccess.GetTableData(string.Format("区域终节点?$select=终节点&$filter=区域代码 eq '"+ obsregion + "'")) as List<Dictionary<string, object>>;
if (data.Count != 0)
{
//endpoint
endpoint = data["终节点"].ToString();
//LogSave("OBS", "endpoint", endpoint);
}
//获取AK
data = DataAccess.GetTableData(string.Format("访问配置?$select=配置项值&$filter=配置项索引 eq 'OBSAK'")) as List<Dictionary<string, object>>;
if (data.Count != 0)
{
//AK
AK = data["配置项值"].ToString();
//LogSave("OBS", "AK", AK);//正式启用时注释此行,防止AK泄露
}
//获取SK
data = DataAccess.GetTableData(string.Format("访问配置?$select=配置项值&$filter=配置项索引 eq 'OBSSK'")) as List<Dictionary<string, object>>;
if (data.Count != 0)
{
//SK
SK = data["配置项值"].ToString();
//LogSave("OBS", "SK", SK);//正式启用时注释此行,防止SK泄露
}
//获取本地附件目录
data = DataAccess.GetTableData(string.Format("访问配置?$select=配置项值&$filter=配置项索引 eq 'LOCALPATH'")) as List<Dictionary<string, object>>;
if (data.Count != 0)
{
//LocalPath
LocalPath = data["配置项值"].ToString();
//LogSave("OBS", "LocalPath", LocalPath);
}
}
public void obsObjectAsync(string obsregion, string BucketName)
{
obsAuth();
//检查AK\SK\endpoint是否获取到
if (AK == "" || SK == "" || endpoint == "") {
LogSave("OBS", "AK、SK、endpoint", "缺少配置");
return;
}
if (BucketName == "")
{
BucketName = defaultBucketName;//设置默认桶
}
// 创建ObsClient实例
ObsClient client = new ObsClient(AK, SK, endpoint);
int maxfileid = 0;
string filepaths = "";
string appUpLoadPath = LocalPath;// "C:\\ProgramData\\Forguncy\\ibm\\3725\\WebSite\\Upload\\";
LogSave("OBS桶对象Async", "maxfileid", "0");
var data = DataAccess.GetTableData(string.Format("文件表?$select=ID,附件&$filter=obs状态 eq 0&$top=1&$orderby=ID desc")) as List<Dictionary<string, object>>;
if (data.Count != 0)
{
maxfileid = Convert.ToInt32(data["ID"].ToString());
filepaths = data["附件"].ToString();
}
LogSave("OBS桶对象Async", "filepaths成功", filepaths);
string[] filepathArray = filepaths.Split('|');
// 上传文件
if (maxfileid >= 0)
{
try
{
foreach (string filename in filepathArray)
{
if (filename != "")
{
LogSave("OBS桶对象Async", "开始同步", filename);
LogSave("OBS桶对象Async", "开始同步FilePath", appUpLoadPath + filename);
LogSave("OBS桶对象Async", "开始同步到桶", BucketName);
PutObjectRequest request = new PutObjectRequest()
{
BucketName = BucketName,
ObjectKey = filename,
FilePath = appUpLoadPath + filename,//待上传的本地文件路径,需要指定到具体的文件名
};
PutObjectResponse response = client.PutObject(request);
LogSave("OBS桶对象", "文件同步成功", filename);
}
}
//定义键为string,值为object类型的Dictionary
Dictionary<string, object> values = new Dictionary<string, object>();
//定义要更新的记录
ColumnValuePair valuepair = new ColumnValuePair();
valuepair.ColumnName = "ID";
valuepair.Value = maxfileid;
//要被更新的值,Key表示列名,值是要被更新的值
values = new Dictionary<string, object>();
values.Add("obs状态", 1);
//使用UpdateTableData方法更新OBS状态
this.DataAccess.UpdateTableData("文件表", valuepair, values);
}
catch (ObsException ex)
{
LogSave("OBS桶对象", "文件同步失败," + ex.ErrorCode, ex.ErrorMessage);
}
}
}
public void LogSave(string logType, string logTitle, string logBody)
{
Dictionary<string, object> tempLogValues = new Dictionary<string, object>();
tempLogValues.Clear();
tempLogValues.Add("日志类型", logType);
tempLogValues.Add("标题", logTitle);
tempLogValues.Add("内容", logBody);
tempLogValues.Add("时间", DateTime.Now.ToString("hh:mm:ss"));
tempLogValues.Add("日期", DateTime.Now.ToString("yyyy-MM-dd"));
this.DataAccess.AddTableData("日志", tempLogValues);
}
}
}
大神求带~ Simon.hu 发表于 2020-3-18 09:30
大神求带~
我都是看胡总的视频学习的。 :hjyzw:
页:
[1]