using Aliyun.OSS;
using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;
namespace Tools.AliYun
{
public class OSS
{
private string accessKeyId;
private string accessKeySecret;
private string bucket;
private string endpoint;
private string host;
///
/// 初始化OSS对象
///
/// key : CRGk7TsNG9qlOt0f
/// keysecret : wTXHa3xHApjEcz1uKCwnEPCgZUiCXf
/// 接入点 : oss-cn-hangzhou.aliyuncs.com
/// 存储名称 : jc-file
public OSS(string accessKeyId, string accessKeySecret, string endpoint, string bucket)
{
this.accessKeyId = accessKeyId;
this.accessKeySecret = accessKeySecret;
this.bucket = bucket;
this.host = "https://" + bucket + "." + endpoint;
this.endpoint = "https://" + endpoint;
}
///
/// 将Unix时间戳转换为DateTime类型时间
///
/// double 型数字
/// DateTime
public static System.DateTime ConvertIntDateTime(double d)
{
System.DateTime time = System.DateTime.MinValue;
System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1));
time = startTime.AddMilliseconds(d);
return time;
}
///
/// 将c# DateTime时间格式转换为Unix时间戳格式
///
/// 时间
/// long
public static long ConvertDateTimeInt(System.DateTime time)
{
//double intResult = 0;
System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1, 0, 0, 0, 0));
//intResult = (time- startTime).TotalMilliseconds;
long t = (time.Ticks - startTime.Ticks) / 10000; //除10000调整为13位
return t;
}
public static string ToBase64hmac(string strText, string strKey)
{
HMACSHA1 myHMACSHA1 = new HMACSHA1(Encoding.UTF8.GetBytes(strKey));
byte[] byteText = myHMACSHA1.ComputeHash(Encoding.UTF8.GetBytes(strText));
return System.Convert.ToBase64String(byteText);
}
///
/// 获取上传验证配置
///
/// 目录: 12/userpic/
/// 过期时间(分钟)
///
public UploadCode GetUploadCode(string dir, string fileName, int expireTime)
{
///
/// 由用户指定的OSS访问地址、阿里云颁发的AccessKeyId/AccessKeySecret构造一个新的OssClient实例。
///
/// OSS的访问地址。
/// OSS的访问ID。
/// OSS的访问密钥。
var ossClient = new OssClient(endpoint, accessKeyId, accessKeySecret);
long expireEndTime = ConvertDateTimeInt(DateTime.Now.AddMinutes(expireTime));
DateTime expiration = ConvertIntDateTime(expireEndTime);
PolicyConditions policyConds = new PolicyConditions();
policyConds.AddConditionItem(PolicyConditions.CondContentLengthRange, 0, 1048576000);
policyConds.AddConditionItem(MatchMode.StartWith, PolicyConditions.CondKey, dir + fileName + ".");
String postPolicy = ossClient.GeneratePostPolicy(expiration, policyConds);
byte[] binaryData = Encoding.UTF8.GetBytes(postPolicy);
String encodedPolicy = Convert.ToBase64String(binaryData);
String postSignature = ToBase64hmac(encodedPolicy, accessKeySecret);
UploadCode s = new UploadCode();
s.accessid = accessKeyId;
s.host = host;
s.policy = encodedPolicy;
s.signature = postSignature;
s.expire = expireEndTime.ToString();
s.dir = dir;
s.filename = fileName;
return s;
}
///
/// 上传文件
///
/// 本地文件
/// 上传后文件
///
public bool UploadFile(string localFile, string ossFile)
{
if (System.IO.File.Exists(localFile))
{
var ossClient = new OssClient(endpoint, accessKeyId, accessKeySecret);
var result = ossClient.PutObject(bucket, ossFile, localFile);
System.IO.File.Delete(localFile);
return true;
}
else
{
return false;
}
}
///
/// 上传文件
///
/// 上传后文件名
/// 文件流
/// 是否成功
public bool UploadFile(string OssFileName, Stream FileStream)
{
if (FileStream == null)
{
return false;
}
var ossClient = new OssClient(endpoint, accessKeyId, accessKeySecret);
var result = ossClient.PutObject(bucket, OssFileName, FileStream);
return true;
}
}
public class UploadCode
{
public string accessid { get; set; }
public string host { get; set; }
public string policy { get; set; }
public string signature { get; set; }
public string expire { get; set; }
public string dir { get; set; }
public string filename { get; set; }
}
}