obs上传文件到服务器,附件同步到华为云OBS存储备份实践(服务端API应用)

发布时间 2023-09-16 10:30:04作者: outrun2023
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 LogValues = new Dictionary();

[Post]

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>;

if (data.Count != 0)

{

//获取默认区域

defaultObsregion = data[0]["配置项值"].ToString();

//LogSave("OBS", "获取默认区域", defaultObsregion );

}

//获取默认桶

data = DataAccess.GetTableData(string.Format("访问配置?$select=配置项值&$filter=配置项索引 eq 'BucketName'")) as List>;

if (data.Count != 0)

{

//获取默认桶

defaultBucketName = data[0]["配置项值"].ToString();

//LogSave("OBS", "获取默认桶", defaultBucketName );

}

if (obsregion == "")

{

obsregion = defaultObsregion;//设置默认区域

}

//获取区域endpoint

data = DataAccess.GetTableData(string.Format("区域终节点?$select=终节点&$filter=区域代码 eq '"+ obsregion + "'")) as List>;

if (data.Count != 0)

{

//endpoint

endpoint = data[0]["终节点"].ToString();

//LogSave("OBS", "endpoint", endpoint);

}

//获取AK

data = DataAccess.GetTableData(string.Format("访问配置?$select=配置项值&$filter=配置项索引 eq 'OBSAK'")) as List>;

if (data.Count != 0)

{

//AK

AK = data[0]["配置项值"].ToString();

//LogSave("OBS", "AK", AK);//正式启用时注释此行,防止AK泄露

}

//获取SK

data = DataAccess.GetTableData(string.Format("访问配置?$select=配置项值&$filter=配置项索引 eq 'OBSSK'")) as List>;

if (data.Count != 0)

{

//SK

SK = data[0]["配置项值"].ToString();

//LogSave("OBS", "SK", SK);//正式启用时注释此行,防止SK泄露

}

//获取本地附件目录

data = DataAccess.GetTableData(string.Format("访问配置?$select=配置项值&$filter=配置项索引 eq 'LOCALPATH'")) as List>;

if (data.Count != 0)

{

//LocalPath

LocalPath = data[0]["配置项值"].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>;

if (data.Count != 0)

{

maxfileid = Convert.ToInt32(data[0]["ID"].ToString());

filepaths = data[0]["附件"].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 values = new Dictionary();

//定义要更新的记录

ColumnValuePair valuepair = new ColumnValuePair();

valuepair.ColumnName = "ID";

valuepair.Value = maxfileid;

//要被更新的值,Key表示列名,值是要被更新的值

values = new Dictionary();

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 tempLogValues = new Dictionary();

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);

}

}

}