示例#1
0
文件: OssHelper.cs 项目: yescent/emud
        public async Task <OssTokenModel> GetToken()
        {
            var targetDir = $"{ DateTime.Now:yyyyMMdd}/{Guid.NewGuid()}";

            OssClient client = new OssClient(_appConfig.Aliyun.Endpoint, _appConfig.Aliyun.AccessKeyId, _appConfig.Aliyun.AccessKeySecret);
            //密钥过期时间为10分钟
            var expiration  = DateTime.Now.AddSeconds(10);
            var policyConds = new PolicyConditions();

            policyConds.AddConditionItem("bucket", _appConfig.Aliyun.BucketName);
            policyConds.AddConditionItem(MatchMode.StartWith, PolicyConditions.CondKey, targetDir);
            //限制传输文件大小10M
            policyConds.AddConditionItem(PolicyConditions.CondContentLengthRange, 1, 10240000);
            var postPolicy = client.GeneratePostPolicy(expiration, policyConds);
            var encPolicy  = Convert.ToBase64String(Encoding.UTF8.GetBytes(postPolicy));
            var signature  = ComputeSignature(_appConfig.Aliyun.AccessKeySecret, encPolicy);
            var tempRet    = new OssTokenModel
            {
                Key            = targetDir,
                Bucket         = _appConfig.Aliyun.BucketName,
                OSSAccessKeyId = _appConfig.Aliyun.AccessKeyId,
                Policy         = encPolicy,
                Signature      = signature,
                Endpoint       = $"https://{_appConfig.Aliyun.BucketName}.oss-cn-hangzhou.aliyuncs.com"
            };

            return(await Task.FromResult(tempRet));
        }
        /// <summary>
        /// 获取oss凭证
        /// </summary>
        /// <returns></returns>
        public OssSignModel GetOssSign()
        {
            callbackparam.callbackUrl = callbackUrl;
            var              host        = string.Format("http://{0}.{1}", bucket, endpoint);
            OssClient        client      = new OssClient(endpoint, accessId, accessKey);
            DateTime         expiration  = DateTime.Now.AddSeconds(expireTime);
            PolicyConditions policyConds = new PolicyConditions();

            policyConds.AddConditionItem(PolicyConditions.CondContentLengthRange, 0, 1050289624);
            policyConds.AddConditionItem(MatchMode.StartWith, PolicyConditions.CondKey, dir);

            string postPolicy    = client.GeneratePostPolicy(expiration.AddHours(8), policyConds);
            string encodedPolicy = Convert.ToBase64String(Encoding.UTF8.GetBytes(postPolicy.ToCharArray()));
            string postSignature = HmacSHA1Signature(accessKey, encodedPolicy);

            var ossmodel = new OssSignModel();

            ossmodel.dir       = dir;
            ossmodel.host      = host;
            ossmodel.accessid  = accessId;
            ossmodel.policy    = encodedPolicy;
            ossmodel.signature = postSignature;
            ossmodel.expire    = (expiration.Ticks - BaseTime.Ticks) / 10000000 - 8 * 60 * 60;
            ossmodel.callback  = Convert.ToBase64String(Encoding.UTF8.GetBytes(JSON.Serialize(callbackparam).ToCharArray()));
            return(ossmodel);
        }
示例#3
0
        /// <summary>
        /// Web直传签名方法
        /// </summary>
        /// <param name="dir">上传的目标文件夹</param>
        /// <param name="min">签名有效期限</param>
        /// <returns>签名信息</returns>
        public static OssSignature SignGen(string dir, int min)
        {
            var now        = DateTime.Now;
            var ex         = now.AddMinutes(min);
            var policyCods = new PolicyConditions();

            policyCods.AddConditionItem("content-length-range", 0L, 1048576000L);
            policyCods.AddConditionItem(MatchMode.StartWith, PolicyConditions.CondKey, dir);
            var      postPolicy    = ossClient.GeneratePostPolicy(ex, policyCods);
            var      binaryData    = Encoding.UTF8.GetBytes(postPolicy);
            var      encodedPolicy = Convert.ToBase64String(binaryData);
            var      hmac          = new HMACSHA1(Encoding.UTF8.GetBytes(AccessKeySecret));
            var      hashBytes     = hmac.ComputeHash(Encoding.UTF8.GetBytes(encodedPolicy));
            var      signature     = Convert.ToBase64String(hashBytes);
            DateTime startTime     = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1));

            return(new OssSignature
            {
                AccessID = AccessKeyID,
                Policy = encodedPolicy,
                Signature = signature,
                Dir = dir,
                EndPoint = Endpoint,
                Expire = (long)(ex - startTime).TotalMilliseconds,
                OSSHost = Host,
            });
        }
示例#4
0
        public async Task <OssPolicyResult> Policy()
        {
            OssPolicyResult result = new OssPolicyResult();
            string          dir    = AppSettings.ALiYun.DirPrefix + DateTime.Now.ToString("yyyyMMdd");
            //long expireEndTime =DateTime.Now.Millisecond + AppSettings.ALiYun.Expire * 1000;
            DateTime         expiration = DateTime.Now.AddMilliseconds(AppSettings.ALiYun.Expire * 1000);
            long             maxSize    = AppSettings.ALiYun.MaxSize * 1024 * 1024;
            OssCallbackParam callback   = new OssCallbackParam();

            callback.CallbackUrl      = AppSettings.ALiYun.Callback;
            callback.CallbackBody     = "filename=${object}&size=${size}&mimeType=${mimeType}&height=${imageInfo.height}&width=${imageInfo.width}";
            callback.CallbackBodyType = "application/x-www-form-urlencoded";
            string action = "http://" + AppSettings.ALiYun.BucketName + "." + AppSettings.ALiYun.EndPoint;

            try
            {
                PolicyConditions policyConds = new PolicyConditions();
                policyConds.AddConditionItem(PolicyConditions.CondContentLengthRange, 0, maxSize);
                policyConds.AddConditionItem(MatchMode.StartWith, PolicyConditions.CondKey, dir);
                OssClient ossClient    = new OssClient(action, AppSettings.ALiYun.AccessKeyId, AppSettings.ALiYun.AccessKeySecret);
                string    postPolicy   = ossClient.GeneratePostPolicy(expiration, policyConds);
                byte[]    binaryData   = postPolicy.GetBytes(Encoding.UTF8);
                string    policy       = Convert.ToBase64String(binaryData);
                string    signature    = ComputeSignature(AppSettings.ALiYun.AccessKeySecret, policy);
                string    callbackData = Convert.ToBase64String(callback.ToJson().ToString().GetBytes(Encoding.UTF8));
                // 返回结果
                result.AccessKeyId = AppSettings.ALiYun.AccessKeyId;
                result.Policy      = policy;
                result.Signature   = signature;
                result.Dir         = dir;
                result.Callback    = callbackData;
                result.Host        = action;
            }
            catch (Exception e)
            {
                Logger.Log(LogLevel.Error, "签名生成失败", e);
            }
            return(result);
        }
        public static void GenPostPolicy(string bucketName)
        {
            try
            {
                var expiration  = DateTime.Now.AddMinutes(10);
                var policyConds = new PolicyConditions();
                policyConds.AddConditionItem("bucket", bucketName);
                // $ must be escaped with backslash.
                policyConds.AddConditionItem(MatchMode.Exact, PolicyConditions.CondKey, "user/eric/\\${filename}");
                policyConds.AddConditionItem(MatchMode.StartWith, PolicyConditions.CondKey, "user/eric");
                policyConds.AddConditionItem(MatchMode.StartWith, "x-oss-meta-tag", "dummy_etag");
                policyConds.AddConditionItem(PolicyConditions.CondContentLengthRange, 1, 1024);

                var postPolicy = client.GeneratePostPolicy(expiration, policyConds);
                var encPolicy  = Convert.ToBase64String(Encoding.UTF8.GetBytes(postPolicy));
                Console.WriteLine("Generated post policy: {0}", postPolicy);

                var requestUri = endpoint + "/" + bucketName;
                var boundary   = "9431149156168";
                var webRequest = (HttpWebRequest)WebRequest.Create(requestUri);
                webRequest.Timeout     = -1;
                webRequest.Method      = "POST";
                webRequest.ContentType = "multipart/form-data; boundary=" + boundary;

                var objectName = "xxx";
                var signature  = ComputeSignature(accessKeySecret, encPolicy);

                var fileContent = "这是一行简单的测试文本";
                var requestBody = "--" + boundary + "\r\n"
                                  + "Content-Disposition: form-data; name=\"key\"\r\n"
                                  + "\r\n" + "user/eric/${filename}" + "\r\n"
                                  + "--" + boundary + "\r\n"
                                  + "Content-Disposition: form-data; name=\"bucket\"\r\n"
                                  + "\r\n" + bucketName + "\r\n"
                                  + "--" + boundary + "\r\n"
                                  + "Content-Disposition: form-data; name=\"x-oss-meta-tag\"\r\n"
                                  + "\r\n" + "dummy_etag_xxx" + "\r\n"
                                  + "--" + boundary + "\r\n"
                                  + "Content-Disposition: form-data; name=\"OSSAccessKeyId\"\r\n"
                                  + "\r\n" + accessKeyId + "\r\n"
                                  + "--" + boundary + "\r\n"
                                  + "Content-Disposition: form-data; name=\"policy\"\r\n"
                                  + "\r\n" + encPolicy + "\r\n"
                                  + "--" + boundary + "\r\n"
                                  + "Content-Disposition: form-data; name=\"Signature\"\r\n"
                                  + "\r\n" + signature + "\r\n"
                                  + "--" + boundary + "\r\n"
                                  + "Content-Disposition: form-data; name=\"file\"; filename=\"" + objectName + "\"\r\n\r\n"
                                  + fileContent + "\r\n"
                                  + "--" + boundary + "\r\n"
                                  + "Content-Disposition: form-data; name=\"submit\"\r\n\r\nUpload to OSS\r\n"
                                  + "--" + boundary + "--\r\n";

                webRequest.ContentLength = requestBody.Length;
                using (var ms = new MemoryStream())
                {
                    var writer = new StreamWriter(ms, new UTF8Encoding());
                    try
                    {
                        writer.Write(requestBody);
                        writer.Flush();
                        ms.Seek(0, SeekOrigin.Begin);

                        webRequest.ContentLength = ms.Length;
                        using (var requestStream = webRequest.GetRequestStream())
                        {
                            ms.WriteTo(requestStream);
                        }
                    }
                    finally
                    {
                        writer.Dispose();
                    }
                }

                var response = webRequest.GetResponse() as HttpWebResponse;
                if (response.StatusCode == HttpStatusCode.NoContent)
                {
                    Console.WriteLine("Post object succeed!");
                }
            }
            catch (OssException ex)
            {
                Console.WriteLine("Failed with error code: {0}; Error info: {1}. \nRequestID:{2}\tHostID:{3}",
                                  ex.ErrorCode, ex.Message, ex.RequestId, ex.HostId);
            }
            catch (Exception ex)
            {
                Console.WriteLine("Failed with error info: {0}", ex.Message);
            }
        }
示例#6
0
        /// <summary>
        /// 获取服务端直传签名(policy和callback)
        /// </summary>
        /// <param name="ossCallbackUrl">OSS往这个机器发送的url请求</param>
        /// <param name="ossCallbackHost">OSS发送这个请求时,请求头部所带的Host头</param>
        /// <param name="tips">提示信息</param>
        /// <param name="reqOssEndpoint">ossEndpoint(默认访问内网)</param>
        /// <param name="ossDir">上传目录 默认:"tools/webUpload/"</param>
        /// <param name="expireTime">过期时间(默认30秒)</param>
        /// <returns></returns>
        public Dictionary <string, string> GetSign(string ossCallbackUrl, string ossCallbackHost, out string tips, string reqOssEndpoint = "", string ossDir = "tools/webUpload/", long expireTime = 30)
        {
            if (Config == null)
            {
                throw new Exception("请先配置OssConfig");
            }
            if (string.IsNullOrEmpty(reqOssEndpoint))
            {
                reqOssEndpoint = Config.OssEndpointIn;//默认内网
            }
            string host;

            if (string.IsNullOrEmpty(Config.OssHost))
            {
                host = Config.OssProtocol + Config.OssBucketName + "." + reqOssEndpoint;
            }
            else if (Config.OssHost.Contains("http://") || Config.OssHost.Contains("https://"))
            {
                host = Config.OssHost;
            }
            else
            {
                host = Config.OssProtocol + Config.OssHost;
            }
            var client = new OssClient(reqOssEndpoint, Config.OssAccessKeyId, Config.OssAccessKeySecret);

            try
            {
                var expiration  = DateTime.Now.AddMilliseconds(expireTime * 1000);
                var policyConds = new PolicyConditions();
                policyConds.AddConditionItem(PolicyConditions.CondContentLengthRange, 0L, 1048576000L);
                policyConds.AddConditionItem(MatchMode.StartWith, PolicyConditions.CondKey, ossDir);
                var postPolicy     = client.GeneratePostPolicy(expiration, policyConds);
                var binaryData     = Encoding.UTF8.GetBytes(postPolicy);
                var encodedPolicy  = Convert.ToBase64String(binaryData);
                var hmac           = new HMACSHA1(Encoding.UTF8.GetBytes(Config.OssAccessKeySecret));
                var hashBytes      = hmac.ComputeHash(Encoding.UTF8.GetBytes(encodedPolicy));
                var postSignature  = Convert.ToBase64String(hashBytes);
                var ts             = expiration.ToUniversalTime() - new DateTime(1970, 1, 1, 0, 0, 0, 0);
                var randomFileName = "oss" + Guid.NewGuid().ToString().Replace("-", "");

                var signDic = new Dictionary <string, string>
                {
                    { "accessid", Config.OssAccessKeyId },
                    { "host", host },
                    { "policy", encodedPolicy },
                    { "signature", postSignature },
                    { "expire", Convert.ToInt64(ts.TotalSeconds).ToString() },
                    { "dir", ossDir },
                    { "filename", randomFileName }
                };
                var callback = JsonConvert.SerializeObject(new
                {
                    callbackUrl      = ossCallbackUrl,
                    callbackHost     = ossCallbackHost,
                    callbackBody     = "filename=${object}&size=${size}&mimeType=${mimeType}&height=${imageInfo.height}&width=${imageInfo.width}", //OSS请求时,发送给应用服务器的内容,可以包括文件的名字、大小、类型,如果是图片可以是图片的高度、宽度
                    callbackBodyType = "application/x-www-form-urlencoded"                                                                         //请求发送的Content-Type
                });
                callback = Convert.ToBase64String(Encoding.UTF8.GetBytes(callback));
                signDic.Add("callback", callback);
                tips = "获取成功";
                return(signDic);
            }
            catch (Exception ex)
            {
                tips = ex.Message;
                return(null);
            }
        }
        public static void GenPostPolicy()
        {
            const string endpoint = "http://oss-test.aliyun-inc.com";
            const string accessId = "0she9sx9tb809ft";
            const string accessKey = "MnBpcGpyMXF5dTc2NnU1Z2t3ZDQ=";

            var client = new OssClient(endpoint, accessId, accessKey);

            try
            {
                var expiration = DateTime.Now.AddMinutes(10);
                var policyConds = new PolicyConditions();
                policyConds.AddConditionItem("bucket", "oss-test2");
                // $ must be escaped with backslash.
                policyConds.AddConditionItem(MatchMode.Exact, PolicyConditions.CondKey, "user/eric/\\${filename}");
                policyConds.AddConditionItem(MatchMode.StartWith, PolicyConditions.CondKey, "user/eric");
                policyConds.AddConditionItem(MatchMode.StartWith, "x-oss-meta-tag", "dummy_etag");
                policyConds.AddConditionItem(PolicyConditions.CondContentLengthRange, 1, 1024);

                var postPolicy = client.GeneratePostPolicy(expiration, policyConds);
                var encPolicy = Convert.ToBase64String(Encoding.UTF8.GetBytes(postPolicy));
                Console.WriteLine("Generated post policy: {0}", postPolicy);

                var requestUri = "http://oss-test2.oss-test.aliyun-inc.com";
                var boundary = "9431149156168";
                var webRequest = (HttpWebRequest)WebRequest.Create(requestUri);
                webRequest.Timeout = -1;
                webRequest.Method = "POST";
                webRequest.ContentType = "multipart/form-data; boundary=" + boundary;

                var objectName = "xxx";
                var bucketName = "oss-test2";
                var signature = ComputeSignature(accessKey, encPolicy);
                Console.WriteLine(signature);
                var fileContent = "这是一行简单的测试文本";
                var requestBody = "--" + boundary + "\r\n"
                        + "Content-Disposition: form-data; name=\"key\"\r\n"
                        + "\r\n" + "user/eric/${filename}" + "\r\n"
                        + "--" + boundary + "\r\n"
                        + "Content-Disposition: form-data; name=\"bucket\"\r\n"
                        + "\r\n" + bucketName + "\r\n"
                        + "--" + boundary + "\r\n"
                        + "Content-Disposition: form-data; name=\"x-oss-meta-tag\"\r\n"
                        + "\r\n" + "dummy_etag_xxx" + "\r\n"
                        + "--" + boundary + "\r\n"
                        + "Content-Disposition: form-data; name=\"OSSAccessKeyId\"\r\n"
                        + "\r\n" + accessId + "\r\n"
                        + "--" + boundary + "\r\n"
                        + "Content-Disposition: form-data; name=\"policy\"\r\n"
                        + "\r\n" + encPolicy + "\r\n"
                        + "--" + boundary + "\r\n"
                        + "Content-Disposition: form-data; name=\"Signature\"\r\n"
                        + "\r\n" + signature + "\r\n"
                        + "--" + boundary + "\r\n"
                        + "Content-Disposition: form-data; name=\"file\"; filename=\"" + objectName + "\"\r\n\r\n"
                        + fileContent + "\r\n"
                        + "--" + boundary + "\r\n"
                        + "Content-Disposition: form-data; name=\"submit\"\r\n\r\nUpload to OSS\r\n"
                        + "--" + boundary + "--\r\n";
                webRequest.ContentLength = requestBody.Length;
                using (var ms = new MemoryStream())
                {
                    var writer = new StreamWriter(ms, new UTF8Encoding());
                    try
                    {
                        writer.Write(requestBody);
                        writer.Flush();
                        ms.Seek(0, SeekOrigin.Begin);

                        webRequest.ContentLength = ms.Length;
                        using (var requestStream = webRequest.GetRequestStream())
                        {
                            ms.WriteTo(requestStream);
                        }
                    }
                    finally
                    {
                        writer.Dispose();
                    }
                }

                var response = webRequest.GetResponse() as HttpWebResponse;
                if (response.StatusCode == HttpStatusCode.NoContent)
                {
                    Console.WriteLine("Post object succeed!");
                }
            }
            catch (OssException ex)
            {
                Console.WriteLine("Failed with error code: {0}; Error info: {1}. \nRequestID:{2}\tHostID:{3}",
                    ex.ErrorCode, ex.Message, ex.RequestId, ex.HostId);
            }
            catch (Exception ex)
            {
                Console.WriteLine("Failed with error info: {0}", ex.Message);
            }
        }