WYB
2021-03-22 91b8cdad021ab052e4991f3d41834a6f0ddc36b8
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
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; }
 
    }
}