Skip to content

Commit

Permalink
fix #4 支持青云。
Browse files Browse the repository at this point in the history
  • Loading branch information
sanjusss committed Sep 15, 2018
1 parent 2a2679e commit 3820884
Show file tree
Hide file tree
Showing 5 changed files with 152 additions and 13 deletions.
6 changes: 3 additions & 3 deletions Backup2Cloud/Backup2Cloud.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@
<TargetFramework>netcoreapp2.0</TargetFramework>
<PackageRequireLicenseAcceptance>false</PackageRequireLicenseAcceptance>
<NeutralLanguage></NeutralLanguage>
<AssemblyVersion>0.0.5.2</AssemblyVersion>
<FileVersion>0.0.5.2</FileVersion>
<Version>0.0.5.2</Version>
<AssemblyVersion>0.0.6.1</AssemblyVersion>
<FileVersion>0.0.6.1</FileVersion>
<Version>0.0.6.1</Version>
<Authors>sanjusss</Authors>
<Company />
<Description>定时将服务器上的文件备份到云存储。</Description>
Expand Down
105 changes: 105 additions & 0 deletions Backup2Cloud/Worker/Uploader/QingStorUploader.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
using Amazon;
using Amazon.S3;
using Amazon.S3.Model;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;

namespace Backup2Cloud.Worker.Uploader
{
/// <summary>
/// 青云对象存储上传实现类。
/// </summary>
[ProviderName("qinstor")]
public class QingStorUploader : IUploader
{
/// <summary>
/// 对象存储空间的外网访问域名
/// </summary>
public string url;
/// <summary>
/// 青云 Access Key ID
/// </summary>
public string accessKeyId;
/// <summary>
/// 青云 Secret Access Key
/// </summary>
public string secretAccessKey;
/// <summary>
/// 文件在Bucket下的路径,作为上传路径前缀。
/// </summary>
public string path;
/// <summary>
/// 提示信息
/// </summary>
public string Tips
{
get
{
return "url:Url (API访问用),在 对象存储 里查看,例如 http://backup.pek3b.qingstor.com" +
"accessKeyId:Access Key ID;" +
"secretAccessKey:Secret Access Key;" +
"path:文件在Bucket/桶下的路径前缀,例如\"data/some\",最终会生成类似\"data/some201809092054.zip\"之类的文件";
}
}
/// <summary>
/// 获取示例实例。
/// </summary>
/// <returns>示例配置实例</returns>
public IUploader GetExample()
{
return new QingStorUploader()
{
url = "http://backup.pek3b.qingstor.com",
accessKeyId = "xxxx",
secretAccessKey = "yyy",
path = "data/file"
};
}

/// <summary>
/// 上传指定文件。
/// </summary>
/// <param name="file">待上传的文件</param>
/// <param name="suffix">文件在云空间里的后缀</param>
/// <exception cref="Exception"/>
public async Task Upload(string file, string suffix)
{
string pattern = @"^http://([^\.]+)\.([^\.]+)\.qingstor\.com$";
var matches = Regex.Matches(url.Trim(), pattern);
if (matches.Count != 1)
{
throw new Exception(string.Format("域名{0}不符合青云对象存储空间的api url的格式。", url));
}

var groups = matches[0].Groups;
string bucket = groups[1].Value;
string systemName = groups[2].Value;
string serverUrl = string.Format("https://s3.{0}.qingstor.com", systemName, bucket);
AmazonS3Config config = new AmazonS3Config()
{
ServiceURL = serverUrl,
SignatureVersion = "v4"
};

using (FileStream stream = new FileStream(file, FileMode.Open))
{
using (AmazonS3Client client = new AmazonS3Client(accessKeyId, secretAccessKey, config))
{

PutObjectRequest request = new PutObjectRequest()
{
BucketName = bucket,
Key = path + suffix,
InputStream = stream
};

await client.PutObjectAsync(request);
}
}
}
}
}
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
|[UCloud](https://www.ucloud.cn)|[UFile](https://www.ucloud.cn/site/product/ufile.html)|![支持](https://img.shields.io/badge/support-Yes-green.svg)|
|[华为云](https://www.huaweicloud.com)|[OBS](https://www.huaweicloud.com/product/obs.html)|![支持](https://img.shields.io/badge/support-Yes-green.svg)|
|[京东云](https://www.jdcloud.com)|[对象存储](https://www.jdcloud.com/products/cloudstorag)|![支持](https://img.shields.io/badge/support-Yes-green.svg)|
|[青云](https://www.qingcloud.com)|[对象存储](https://www.qingcloud.com/products/qingstor/)|![即将到来](https://img.shields.io/badge/support-Future-yellow.svg)|
|[青云](https://www.qingcloud.com)|[对象存储](https://www.qingcloud.com/products/qingstor/)|![支持](https://img.shields.io/badge/support-Yes-green.svg)|
|[金山云](https://www.ksyun.com)|[对象存储](https://www.ksyun.com/post/product/KS3)|![不支持](https://img.shields.io/badge/support-No-red.svg)|仅限企业用户|
|[Azure](https://www.azure.cn/zh-cn/)|[Blob 存储](https://www.azure.cn/zh-cn/home/features/storage/blobs/)|![即将到来](https://img.shields.io/badge/support-Future-yellow.svg)|
|[Google Cloud](https://cloud.google.com)|[Google Cloud Storage](https://cloud.google.com/storage/)|![即将到来](https://img.shields.io/badge/support-Future-yellow.svg)|
Expand Down
2 changes: 1 addition & 1 deletion appveyor.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@

version: 0.0.5.2.{build}
version: 0.0.6.1.{build}
image: Visual Studio 2017
shallow_clone: true
build_script:
Expand Down
50 changes: 42 additions & 8 deletions example.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
"crontab": [
"0,30 * * * * ?"
],
"command": "echo",
"commandArgs": "Hello World!",
"uploader": {
"endpoint": "oss-cn-hangzhou.aliyuncs.com",
"id": "阿里云AccessKeyId",
Expand All @@ -15,7 +17,7 @@
"timeout": 200000,
"Tips": "endpoint:地域节点(可以在控制台查看);id:阿里云AccessKeyId(可以在控制台查看);secret:阿里云AccessKeySecret(可以在控制台查看);bucket:存储空间名path:文件在存储空间下的路径前缀,例如\"data/some\",最终会生成类似\"data/some201809092054.zip\"之类的文件;timeout:上传超时时间,单位毫秒,可以不设置"
},
"Tips": "name:任务名称;provider:上传服务提供商;path:需要备份的文件夹或文件在本地的路径;crontab:启动备份的时间集合,可以参考http://cron.qqe2.com/,使用时需要注意时区;uploader:上传设置"
"Tips": "name:任务名称;provider:上传服务提供商;path:需要备份的文件夹或文件在本地的路径;crontab:启动备份的时间集合,可以参考http://cron.qqe2.com/,使用时需要注意时区;command:打包备份文件夹或文件之前额外执行的命令,例如备份数据库等,使用docker容器时须注意执行环境,可以为空;commandArgs:打包备份文件夹或文件之前额外执行的命令的参数,,可以为空;uploader:上传设置"
},
{
"name": "上传到 aws",
Expand All @@ -24,6 +26,8 @@
"crontab": [
"0,30 * * * * ?"
],
"command": "echo",
"commandArgs": "Hello World!",
"uploader": {
"regionSystemName": "us-west-1",
"awsAccessKeyId": "xxxx",
Expand All @@ -32,7 +36,7 @@
"path": "data/file",
"Tips": "regionSystemName:区域的系统名,例如 us-west-1awsAccessKeyId:AWS Access Key ID;awsSecretAccessKey:AWS Secret Access Key;bucket:Bucket/桶;path:文件在Bucket/桶下的路径前缀,例如\"data/some\",最终会生成类似\"data/some201809092054.zip\"之类的文件"
},
"Tips": "name:任务名称;provider:上传服务提供商;path:需要备份的文件夹或文件在本地的路径;crontab:启动备份的时间集合,可以参考http://cron.qqe2.com/,使用时需要注意时区;uploader:上传设置"
"Tips": "name:任务名称;provider:上传服务提供商;path:需要备份的文件夹或文件在本地的路径;crontab:启动备份的时间集合,可以参考http://cron.qqe2.com/,使用时需要注意时区;command:打包备份文件夹或文件之前额外执行的命令,例如备份数据库等,使用docker容器时须注意执行环境,可以为空;commandArgs:打包备份文件夹或文件之前额外执行的命令的参数,,可以为空;uploader:上传设置"
},
{
"name": "上传到 baidu",
Expand All @@ -41,6 +45,8 @@
"crontab": [
"0,30 * * * * ?"
],
"command": "echo",
"commandArgs": "Hello World!",
"uploader": {
"endpoint": "https://su.bcebos.com",
"id": "百度云AccessKeyId",
Expand All @@ -50,7 +56,7 @@
"timeout": 200000,
"Tips": "endpoint:地域节点北京区域:https://bj.bcebos.com ,广州区域:https://gz.bcebos.com, 苏州区域:https://su.bcebos.com (可以在控制台查看);id:百度云AccessKeyId(可以在控制台查看);secret:百度云SecretAccessKey(可以在控制台查看);bucket:存储空间名path:文件在存储空间下的路径前缀,例如\"data/some\",最终会生成类似\"data/some201809092054.zip\"之类的文件;timeout:上传超时时间,单位毫秒"
},
"Tips": "name:任务名称;provider:上传服务提供商;path:需要备份的文件夹或文件在本地的路径;crontab:启动备份的时间集合,可以参考http://cron.qqe2.com/,使用时需要注意时区;uploader:上传设置"
"Tips": "name:任务名称;provider:上传服务提供商;path:需要备份的文件夹或文件在本地的路径;crontab:启动备份的时间集合,可以参考http://cron.qqe2.com/,使用时需要注意时区;command:打包备份文件夹或文件之前额外执行的命令,例如备份数据库等,使用docker容器时须注意执行环境,可以为空;commandArgs:打包备份文件夹或文件之前额外执行的命令的参数,,可以为空;uploader:上传设置"
},
{
"name": "上传到 huawei",
Expand All @@ -59,6 +65,8 @@
"crontab": [
"0,30 * * * * ?"
],
"command": "echo",
"commandArgs": "Hello World!",
"uploader": {
"endpoint": "obs.cn-north-1.myhwclouds.com",
"accessKeyId": "xxxx",
Expand All @@ -68,7 +76,7 @@
"deleteAfterDays": 20,
"Tips": "endpoint:地域节点(可以在控制台查看);accessKeyId:华为云 Access Key Id(可以在控制台查看);secretAccessKey:华为云 Secret Access Key(可以在控制台查看);bucket:桶名称path:文件在存储空间下的路径前缀,例如\"data/some\",最终会生成类似\"data/some201809092054.zip\"之类的文件;deleteAfterDays:多少天后自动删除,可以不设置"
},
"Tips": "name:任务名称;provider:上传服务提供商;path:需要备份的文件夹或文件在本地的路径;crontab:启动备份的时间集合,可以参考http://cron.qqe2.com/,使用时需要注意时区;uploader:上传设置"
"Tips": "name:任务名称;provider:上传服务提供商;path:需要备份的文件夹或文件在本地的路径;crontab:启动备份的时间集合,可以参考http://cron.qqe2.com/,使用时需要注意时区;command:打包备份文件夹或文件之前额外执行的命令,例如备份数据库等,使用docker容器时须注意执行环境,可以为空;commandArgs:打包备份文件夹或文件之前额外执行的命令的参数,,可以为空;uploader:上传设置"
},
{
"name": "上传到 JDCloud",
Expand All @@ -77,14 +85,16 @@
"crontab": [
"0,30 * * * * ?"
],
"command": "echo",
"commandArgs": "Hello World!",
"uploader": {
"domain": "backup.oss.cn-east-2.jcloudcs.com",
"accessKeyId": "xxxx",
"secretAccessKey": "yyy",
"path": "data/file",
"Tips": "domain:对象存储空间的外网访问域名,在 对象存储-空间管理-空间信息 里查看,例如backup.oss.cn-east-2.jcloudcs.comaccessKeyId:Access Key ID;secretAccessKey:Secret Access Key;path:文件在Bucket/桶下的路径前缀,例如\"data/some\",最终会生成类似\"data/some201809092054.zip\"之类的文件"
},
"Tips": "name:任务名称;provider:上传服务提供商;path:需要备份的文件夹或文件在本地的路径;crontab:启动备份的时间集合,可以参考http://cron.qqe2.com/,使用时需要注意时区;uploader:上传设置"
"Tips": "name:任务名称;provider:上传服务提供商;path:需要备份的文件夹或文件在本地的路径;crontab:启动备份的时间集合,可以参考http://cron.qqe2.com/,使用时需要注意时区;command:打包备份文件夹或文件之前额外执行的命令,例如备份数据库等,使用docker容器时须注意执行环境,可以为空;commandArgs:打包备份文件夹或文件之前额外执行的命令的参数,,可以为空;uploader:上传设置"
},
{
"name": "上传到 qcloud",
Expand All @@ -93,14 +103,34 @@
"crontab": [
"0,30 * * * * ?"
],
"command": "echo",
"commandArgs": "Hello World!",
"uploader": {
"appId": "123456",
"secretId": "xxxx",
"secretKey": "yyyy",
"url": "https://backup-123456.cos.ap-chengdu.myqcloud.com/test",
"Tips": "appId:腾讯云 APPID(可以在控制台查看);secretId:腾讯云 SecretId(可以在控制台查看);secretKey:腾讯云 SecretKey(可以在控制台查看);url:绝对路径,例如\"https://backup-123456.cos.ap-chengdu.myqcloud.com/test\",最终会生成类似\"https://backup-123456.cos.ap-chengdu.myqcloud.com/test201809092054.zip\"之类的文件,可以在 控制台-对象存储-存储桶列表-点击实际的桶名称-基础设置-访问域名 中找到url的前部分,后部分是文件相对于桶的路径"
},
"Tips": "name:任务名称;provider:上传服务提供商;path:需要备份的文件夹或文件在本地的路径;crontab:启动备份的时间集合,可以参考http://cron.qqe2.com/,使用时需要注意时区;uploader:上传设置"
"Tips": "name:任务名称;provider:上传服务提供商;path:需要备份的文件夹或文件在本地的路径;crontab:启动备份的时间集合,可以参考http://cron.qqe2.com/,使用时需要注意时区;command:打包备份文件夹或文件之前额外执行的命令,例如备份数据库等,使用docker容器时须注意执行环境,可以为空;commandArgs:打包备份文件夹或文件之前额外执行的命令的参数,,可以为空;uploader:上传设置"
},
{
"name": "上传到 qinstor",
"provider": "qinstor",
"path": "/data",
"crontab": [
"0,30 * * * * ?"
],
"command": "echo",
"commandArgs": "Hello World!",
"uploader": {
"url": "http://backup.pek3b.qingstor.com",
"accessKeyId": "xxxx",
"secretAccessKey": "yyy",
"path": "data/file",
"Tips": "url:Url (API访问用),在 对象存储 里查看,例如 http://backup.pek3b.qingstor.comaccessKeyId:Access Key ID;secretAccessKey:Secret Access Key;path:文件在Bucket/桶下的路径前缀,例如\"data/some\",最终会生成类似\"data/some201809092054.zip\"之类的文件"
},
"Tips": "name:任务名称;provider:上传服务提供商;path:需要备份的文件夹或文件在本地的路径;crontab:启动备份的时间集合,可以参考http://cron.qqe2.com/,使用时需要注意时区;command:打包备份文件夹或文件之前额外执行的命令,例如备份数据库等,使用docker容器时须注意执行环境,可以为空;commandArgs:打包备份文件夹或文件之前额外执行的命令的参数,,可以为空;uploader:上传设置"
},
{
"name": "上传到 qiniu",
Expand All @@ -109,6 +139,8 @@
"crontab": [
"0,30 * * * * ?"
],
"command": "echo",
"commandArgs": "Hello World!",
"uploader": {
"accessKey": "accessKey",
"secretKey": "secretKey",
Expand All @@ -118,7 +150,7 @@
"deleteAfterDays": 5,
"Tips": "accessKey:七牛云AccessKey(可以在控制台查看);secretKey:七牛云SecretKey(可以在控制台查看);bucket:存储空间名path:文件在存储空间下的路径前缀,例如\"data/some\",最终会生成类似\"data/some201809092054.zip\"之类的文件;timeout:上传超时时间,单位毫秒,可以不设置;deleteAfterDays:多少天后自动删除,可以不设置"
},
"Tips": "name:任务名称;provider:上传服务提供商;path:需要备份的文件夹或文件在本地的路径;crontab:启动备份的时间集合,可以参考http://cron.qqe2.com/,使用时需要注意时区;uploader:上传设置"
"Tips": "name:任务名称;provider:上传服务提供商;path:需要备份的文件夹或文件在本地的路径;crontab:启动备份的时间集合,可以参考http://cron.qqe2.com/,使用时需要注意时区;command:打包备份文件夹或文件之前额外执行的命令,例如备份数据库等,使用docker容器时须注意执行环境,可以为空;commandArgs:打包备份文件夹或文件之前额外执行的命令的参数,,可以为空;uploader:上传设置"
},
{
"name": "上传到 ucloud",
Expand All @@ -127,6 +159,8 @@
"crontab": [
"0,30 * * * * ?"
],
"command": "echo",
"commandArgs": "Hello World!",
"uploader": {
"publicKey": "publicKey",
"privateKey": "privateKey",
Expand All @@ -135,6 +169,6 @@
"path": "data/some",
"Tips": "accessKey:UCloud 公钥(可以在控制台-产品服务-API 产品-API密钥 查看);secretKey:UCloud 私钥(可以在控制台-产品服务-API 产品-API密钥 查看);bucket:存储空间名;bucketDomain:存储空间域名 类似<bucketname>.cn-sh2.ufileos.com;path:文件在存储空间下的路径前缀,例如\"data/some\",最终会生成类似\"data/some201809092054.zip\"之类的文件"
},
"Tips": "name:任务名称;provider:上传服务提供商;path:需要备份的文件夹或文件在本地的路径;crontab:启动备份的时间集合,可以参考http://cron.qqe2.com/,使用时需要注意时区;uploader:上传设置"
"Tips": "name:任务名称;provider:上传服务提供商;path:需要备份的文件夹或文件在本地的路径;crontab:启动备份的时间集合,可以参考http://cron.qqe2.com/,使用时需要注意时区;command:打包备份文件夹或文件之前额外执行的命令,例如备份数据库等,使用docker容器时须注意执行环境,可以为空;commandArgs:打包备份文件夹或文件之前额外执行的命令的参数,,可以为空;uploader:上传设置"
}
]

0 comments on commit 3820884

Please sign in to comment.