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;
|
|
|
/// <summary>
|
/// 初始化OSS对象
|
/// </summary>
|
/// <param name="accessKeyId">key : CRGk7TsNG9qlOt0f</param>
|
/// <param name="accessKeySecret"> keysecret : wTXHa3xHApjEcz1uKCwnEPCgZUiCXf</param>
|
/// <param name="endpoint">接入点 : oss-cn-hangzhou.aliyuncs.com</param>
|
/// <param name="bucket">存储名称 : jc-file</param>
|
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;
|
}
|
|
|
/// <summary>
|
/// 将Unix时间戳转换为DateTime类型时间
|
/// </summary>
|
/// <param name="d">double 型数字</param>
|
/// <returns>DateTime</returns>
|
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;
|
}
|
|
|
/// <summary>
|
/// 将c# DateTime时间格式转换为Unix时间戳格式
|
/// </summary>
|
/// <param name="time">时间</param>
|
/// <returns>long</returns>
|
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);
|
}
|
|
|
/// <summary>
|
/// 获取上传验证配置
|
/// </summary>
|
/// <param name="dir">目录: 12/userpic/</param>
|
/// <param name="expireTime">过期时间(分钟)</param>
|
/// <returns></returns>
|
public UploadCode GetUploadCode(string dir, string fileName, int expireTime)
|
{
|
/// <summary>
|
/// 由用户指定的OSS访问地址、阿里云颁发的AccessKeyId/AccessKeySecret构造一个新的OssClient实例。
|
/// </summary>
|
/// <param name="endpoint">OSS的访问地址。</param>
|
/// <param name="accessKeyId">OSS的访问ID。</param>
|
/// <param name="accessKeySecret">OSS的访问密钥。</param>
|
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;
|
}
|
|
|
/// <summary>
|
/// 上传文件
|
/// </summary>
|
/// <param name="localFile">本地文件</param>
|
/// <param name="ossFile">上传后文件</param>
|
/// <returns></returns>
|
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;
|
}
|
|
}
|
|
/// <summary>
|
/// 上传文件
|
/// </summary>
|
/// <param name="OssFileName">上传后文件名</param>
|
/// <param name="FileStream">文件流</param>
|
/// <returns>是否成功</returns>
|
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; }
|
|
}
|
}
|