app转转风 发表于 2020-3-17 13:22:12

附件同步到华为云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:35

大神求带~

app转转风 发表于 2020-3-18 12:14:59

Simon.hu 发表于 2020-3-18 09:30
大神求带~

我都是看胡总的视频学习的。

Simon.hu 发表于 2020-3-19 09:14:14

:hjyzw:
页: [1]
查看完整版本: 附件同步到华为云OBS存储备份实践(服务端API应用)