Skip to content

Commit c6c19dc

Browse files
committed
增加post 流方式。 增加生成下载链接。
1 parent 7a6ca48 commit c6c19dc

File tree

4 files changed

+140
-0
lines changed

4 files changed

+140
-0
lines changed

src/Entites/OssRegions.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,14 @@ public class OssRegions
1717
// 华北 2
1818
public const string BeiJing = "oss-cn-beijing";
1919

20+
// 华北3 张家口
21+
public const string ZhangJiaKou = "oss-cn-zhangjiakou";
22+
23+
// 华北5 呼和浩特
24+
public const string HuHeHaoTe = "oss-cn-huhehaote";
25+
26+
27+
2028
// 华南 1
2129
public const string ShenZhen = "oss-cn-shenzhen";
2230

src/OssClient.cs

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using System.Collections.Generic;
33
using System.IO;
44
using System.Linq;
5+
using System.Net;
56
using System.Threading.Tasks;
67
using Cuiliang.AliyunOssSdk.Api;
78
using Cuiliang.AliyunOssSdk.Api.Bucket.List;
@@ -16,6 +17,7 @@
1617
using Cuiliang.AliyunOssSdk.Entites;
1718
using Cuiliang.AliyunOssSdk.Request;
1819
using Cuiliang.AliyunOssSdk.Utility;
20+
using Cuiliang.AliyunOssSdk.Utility.Authentication;
1921

2022
namespace Cuiliang.AliyunOssSdk
2123
{
@@ -104,6 +106,28 @@ public async Task<OssResult<PutObjectResult>> PutObjectByFileNameAsync(BucketInf
104106
}
105107
}
106108

109+
/// <summary>
110+
/// 上传流
111+
/// </summary>
112+
/// <param name="bucket"></param>
113+
/// <param name="key"></param>
114+
/// <param name="content">内容流</param>
115+
/// <param name="mimeType"></param>
116+
/// <returns></returns>
117+
public async Task<OssResult<PutObjectResult>> PutObjectAsync(BucketInfo bucket, string key, Stream content,
118+
string mimeType = "application/octet-stream")
119+
{
120+
var file = new RequestContent()
121+
{
122+
ContentType = RequestContentType.String,
123+
StreamContent = content,
124+
MimeType = mimeType
125+
};
126+
127+
return await PutObjectAsync(bucket, key, file);
128+
}
129+
130+
107131
/// <summary>
108132
/// 复制对象
109133
/// </summary>
@@ -205,5 +229,44 @@ public async Task<OssResult<GetObjectMetaResult>> GetObjectMetaAsync(BucketInfo
205229
var cmd = new GetObjectMetaCommand(_requestContext, bucket, key);
206230
return await cmd.ExecuteAsync();
207231
}
232+
233+
/// <summary>
234+
/// 获取文件的下载链接
235+
/// </summary>
236+
/// <param name="storeKey"></param>
237+
/// <param name="expireSeconds"></param>
238+
/// <returns></returns>
239+
public string GetFileDownloadLink(BucketInfo bucket, string storeKey, int expireSeconds)
240+
{
241+
long seconds = (DateTime.UtcNow.Ticks - 621355968000000000) / 10000000;
242+
243+
string toSign = String.Format("GET\n\n\n{0}\n/{1}/{2}", seconds, bucket, storeKey);
244+
245+
string sign = ServiceSignature.Create().ComputeSignature(
246+
_requestContext.OssCredential.AccessKeyId, toSign);
247+
248+
string url = String.Format("{0}{1}/{2}?OSSAccessKeyId={3}&Expires={4}&Signature={5}",
249+
bucket.EndpointUri,
250+
bucket,
251+
storeKey,
252+
_requestContext.OssCredential.AccessKeyId,
253+
seconds,
254+
WebUtility.UrlEncode(sign));
255+
256+
return url;
257+
}
258+
259+
/// <summary>
260+
/// 生成直接post到oss的签名
261+
/// </summary>
262+
/// <param name="policy"></param>
263+
/// <returns></returns>
264+
public string ComputePostSignature(string policy)
265+
{
266+
string sign = ServiceSignature.Create().ComputeSignature(
267+
_requestContext.OssCredential.AccessKeyId, policy);
268+
269+
return sign;
270+
}
208271
}
209272
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Diagnostics;
4+
using System.Security.Cryptography;
5+
using System.Text;
6+
7+
namespace Cuiliang.AliyunOssSdk.Utility.Authentication
8+
{
9+
public class HmacSHA1Signature: ServiceSignature
10+
{
11+
private readonly Encoding _encoding = Encoding.UTF8;
12+
13+
public override string SignatureMethod
14+
{
15+
get { return "HmacSHA1"; }
16+
}
17+
18+
public override string SignatureVersion
19+
{
20+
get { return "1"; }
21+
}
22+
23+
protected override string ComputeSignatureCore(string key, string data)
24+
{
25+
Debug.Assert(!string.IsNullOrEmpty(data));
26+
27+
using (var algorithm = KeyedHashAlgorithm.Create(
28+
SignatureMethod.ToString().ToUpperInvariant()))
29+
{
30+
algorithm.Key = _encoding.GetBytes(key.ToCharArray());
31+
return Convert.ToBase64String(
32+
algorithm.ComputeHash(_encoding.GetBytes(data.ToCharArray())));
33+
}
34+
}
35+
}
36+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
using System;
2+
3+
namespace Cuiliang.AliyunOssSdk.Utility.Authentication
4+
{
5+
public abstract class ServiceSignature
6+
{
7+
8+
public abstract string SignatureMethod { get; }
9+
10+
public abstract string SignatureVersion { get; }
11+
12+
public string ComputeSignature(String key, String data)
13+
{
14+
if (string.IsNullOrEmpty(key))
15+
throw new ArgumentException(
16+
"参数为空", "key");
17+
if (string.IsNullOrEmpty(data))
18+
throw new ArgumentException(
19+
"参数为空", "data");
20+
21+
22+
return ComputeSignatureCore(key, data);
23+
}
24+
25+
protected abstract string ComputeSignatureCore(string key, string data);
26+
27+
public static ServiceSignature Create()
28+
{
29+
return new HmacSHA1Signature();
30+
}
31+
32+
}
33+
}

0 commit comments

Comments
 (0)