public static void GetObjectBySignedUrlWithWebRequest(string bucketName, string key)
        {
            try
            {
                var metadata = client.GetObjectMetadata(bucketName, key);
                var etag = metadata.ETag;

                var req = new GeneratePresignedUriRequest(bucketName, key, SignHttpMethod.Get);
                req.AddQueryParam("param1", "value1");
                req.ContentType = "text/html";
                req.ContentMd5 = etag;
                req.AddUserMetadata("mk1", "mv1");
                req.ResponseHeaders.CacheControl = "No-Cache";
                req.ResponseHeaders.ContentEncoding = "utf-8";
                req.ResponseHeaders.ContentType = "text/html";

                // Generates url signature for accessing specified object.
                var uri = client.GeneratePresignedUri(req);

                var webRequest = (HttpWebRequest)WebRequest.Create(uri);
                webRequest.ContentType = "text/html";
                webRequest.Headers.Add(HttpRequestHeader.ContentMd5, etag);
                webRequest.Headers.Add("x-oss-meta-mk1", "mv1");
                var resp = webRequest.GetResponse() as HttpWebResponse;
                var output = resp.GetResponseStream();
                var bufferSize = 2048;
                var bytes = new byte[bufferSize];
                try
                {
                    using (StreamWriter outfile = new StreamWriter(fileToSave)) 
                    {
                        var length = 0;
                        do
                        {
                            length = output.Read(bytes, 0, bufferSize);
                            outfile.Write(bytes);
                        } while (length > 0);
                    }
                    output.Close();

                    Console.WriteLine("Get object by signatrue succeeded.");
                }
                catch (Exception ex)
                {
                    Console.WriteLine("ex : " + ex.Message);
                }
            }
            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);
            }
        }
Exemplo n.º 2
0
        public void GeneratePresignedUriCallbackTest()
        {
            string callbackHeaderBuilder         = new CallbackHeaderBuilder(_callbackUrl, _callbackBody).Build();
            string CallbackVariableHeaderBuilder = new CallbackVariableHeaderBuilder().
                                                   AddCallbackVariable("x:var1", "x:value1").AddCallbackVariable("x:var2", "x:value2").Build();

            var gpuRequest = new GeneratePresignedUriRequest(_bucketName, _objectKey, SignHttpMethod.Put)
            {
                ContentType = "text/rtf",
                Expiration  = DateTime.Now.AddHours(1),
                Callback    = callbackHeaderBuilder,
                CallbackVar = CallbackVariableHeaderBuilder
            };

            gpuRequest.UserMetadata.Add("Author", "Mingdi");
            var uri = _ossClient.GeneratePresignedUri(gpuRequest);

            var metadata = new ObjectMetadata();

            metadata.ContentType = "text/rtf";
            metadata.UserMetadata.Add("Author", "Mingdi");
            metadata.AddHeader(HttpHeaders.Callback, callbackHeaderBuilder);
            metadata.AddHeader(HttpHeaders.CallbackVar, CallbackVariableHeaderBuilder);

            var putObjectResult = _ossClient.PutObject(uri, Config.UploadTestFile, metadata);

            Assert.IsTrue(putObjectResult.IsSetResponseStream());
            Assert.AreEqual(_callbackOkResponse, GetCallbackResponse(putObjectResult));
            Assert.AreEqual(putObjectResult.HttpStatusCode, HttpStatusCode.OK);
            Assert.AreEqual(putObjectResult.ContentLength, _callbackOkResponse.Length);
            Assert.AreEqual(putObjectResult.RequestId.Length, "58DB0ACB686D42D5B4163D75".Length);
            Assert.AreEqual(putObjectResult.ResponseMetadata[HttpHeaders.ContentType], "application/json");
            Assert.AreEqual(putObjectResult.ResponseMetadata[HttpHeaders.ETag], putObjectResult.ETag);
            Assert.AreEqual(putObjectResult.ResponseMetadata[HttpHeaders.ContentMd5].Length, "7GoU4OYaYroKXsbsG1f/lw==".Length);
            Assert.IsTrue(putObjectResult.ResponseMetadata[HttpHeaders.HashCrc64Ecma].Length > 0);
            Assert.IsTrue(putObjectResult.ResponseMetadata[HttpHeaders.ServerElapsedTime].Length > 0);
            Assert.AreEqual(putObjectResult.ResponseMetadata[HttpHeaders.Date].Length, "Wed, 29 Mar 2017 01:15:58 GMT".Length);

            _ossClient.DeleteObject(_bucketName, _objectKey);
        }
Exemplo n.º 3
0
        public string GetUrlCustom(IStorageInfo storageInfo, MediaElementUrlType urlType, string filePath, string fileName, string customStyleProcessStr)
        {
            if (string.IsNullOrEmpty(filePath))
            {
                filePath = DEFAULT_CONTAINER;
            }
            filePath = filePath.Trim('/');
            fileName = fileName.Trim('/');
            if (urlType == MediaElementUrlType.PublishOutputUrl || urlType == MediaElementUrlType.PublishDownloadUrl)
            {
                var downloadHost = storageInfo.StorageHost.Trim('/');
                if (!string.IsNullOrEmpty(customStyleProcessStr))
                {
                    customStyleProcessStr = "?x-oss-process=" + customStyleProcessStr;
                }
                return($"{downloadHost}/{filePath}/{fileName}{customStyleProcessStr}");
            }
            else
            {
                string    bucketName, objectName;
                OssClient client;
                GetClient(storageInfo.StorageId, storageInfo.StorageAccessKey,
                          storageInfo.NetType, filePath, fileName,
                          out bucketName, out objectName, out client);

                //string objectKey = //($"{filePath}/{fileName}");
                //    ($"{filePath}/{fileName}?{customStyleProcessStr}");
                //.Trim(new char[] { '/' });

                GeneratePresignedUriRequest request = new GeneratePresignedUriRequest(bucketName, objectName);
                request.Process    = customStyleProcessStr;
                request.Expiration = DateTime.Now.AddHours(1);
                request.Method     = SignHttpMethod.Get;

                var presignedUri = client.GeneratePresignedUri(request);

                return(presignedUri.AbsoluteUri);
            }
        }
Exemplo n.º 4
0
        public static void getObjectBySignedUrl2()
        {
            const string accessKeyId     = "<your access key id>";
            const string accessKeySecret = "<your access key secret>";
            const string endpoint        = "<valid host name>";

            const string bucketName = "<bucket name>";
            const string key        = "<object name>";

            OssClient client = new OssClient(endpoint, accessKeyId, accessKeySecret);

            try
            {
                var metadata = client.GetObjectMetadata(bucketName, key);
                var etag     = metadata.ETag;

                var req = new GeneratePresignedUriRequest(bucketName, key, SignHttpMethod.Get);
                // Generates url signature for accessing specified object.
                var uri = client.GeneratePresignedUri(req);

                Console.WriteLine(uri.ToString());

                OssObject ossObject = client.GetObject(uri);
                var       file      = File.Open("<file to hold object content>", FileMode.OpenOrCreate);
                Stream    stream    = ossObject.Content;
                byte[]    bytes     = new byte[stream.Length];
                stream.Read(bytes, 0, bytes.Length);
                file.Write(bytes, 0, bytes.Length);
            }
            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);
            }
        }
        public string GetImageUrl(string key, ImageSize imgSize)
        {
            if (!string.IsNullOrEmpty(key) && (key.StartsWith("http:") || key.StartsWith("https:")))
            {
                return(key); // 不是存储在阿里的Oss上的图片
            }

            try
            {
                var now    = DateTime.Now;
                var expire = new DateTime(now.Year, now.Month, now.Day, 0, 0, 0).AddYears(1);
                var bucket = GetBucketName(AttachmentType.Picture);
                switch (imgSize)
                {
                case ImageSize.Small:
                {
                    var request = new GeneratePresignedUriRequest(bucket, key);
                    request.Expiration = expire;
                    request.Process    = "image/resize,p_60";
                    return(client.GeneratePresignedUri(request)?.AbsoluteUri);
                }

                case ImageSize.Mid:
                {
                    var request = new GeneratePresignedUriRequest(bucket, key);
                    request.Expiration = expire;
                    request.Process    = "image/resize,p_50";
                    return(client.GeneratePresignedUri(request)?.AbsoluteUri);
                }

                default:
                    return(client.GeneratePresignedUri(bucket, key, expire)?.AbsoluteUri);
                }
            }
            catch
            {
                return(string.Empty);
            }
        }
Exemplo n.º 6
0
        public void AliGeneratePresignedUriTest()
        {
            string ossEndpoint        = NTKeyword.CloudFileDomain;
            string ossAccessKeyId     = "ATAI4G7BGjsCjRF2ThyDdgBo";       // 假的
            string ossAccessKeySecret = "A1VdRfHJ6k8NeklCtHjQlt7MYlRShE"; // 假的
            var    ossClient          = new OssClient(ossEndpoint, ossAccessKeyId, ossAccessKeySecret);
            var    req = new GeneratePresignedUriRequest("ntminer", "helloworld.exe", SignHttpMethod.Get)
            {
                Expiration = DateTime.Now.AddMinutes(10)
            };
            var uri = ossClient.GeneratePresignedUri(req);

            Console.WriteLine(uri.ToString());
            req = new GeneratePresignedUriRequest("ntminer", "helloworld.exe", SignHttpMethod.Get);
            uri = ossClient.GeneratePresignedUri(req);
            Console.WriteLine(uri.ToString());
            TimeSpan ts = req.Expiration - DateTime.Now;

            Console.WriteLine(ts.TotalSeconds);
            // 默认是15分钟
            Assert.IsTrue(ts.TotalSeconds > 14 * 60 && ts.TotalSeconds < 16 * 60);
        }
Exemplo n.º 7
0
        public string GetBlobSasUrl(string containerName, string blobName, DateTimeOffset expiry, bool isDownload = false,
                                    string filename = null, string contentType = null, BlobUrlAccess access = BlobUrlAccess.Read)
        {
            var req = new GeneratePresignedUriRequest(containerName, blobName)
            {
                Expiration = expiry.DateTime
            };

            switch (access)
            {
            case BlobUrlAccess.None:
            case BlobUrlAccess.Read:
                req.Method = SignHttpMethod.Get;
                break;

            case BlobUrlAccess.Write:
                req.Method = SignHttpMethod.Put;
                break;

            case BlobUrlAccess.Delete:
                throw new NotSupportedException("BlobUrlAccess.Delete");

            case BlobUrlAccess.All:
                throw new NotSupportedException("BlobUrlAccess.All");
            }
            if (!string.IsNullOrWhiteSpace(contentType))
            {
                req.ContentType = contentType;
            }

            if (!string.IsNullOrWhiteSpace(filename))
            {
                req.ResponseHeaders.ContentDisposition = "inline;filename=" + filename;
            }

            var uri = _ossClient.GeneratePresignedUri(req);

            return(uri.ToString());
        }
        public static void GetObjectBySignedUrlWithClient(string bucketName, string key)
        {
            try
            {
                var metadata = client.GetObjectMetadata(bucketName, key);
                var etag     = metadata.ETag;

                var req = new GeneratePresignedUriRequest(bucketName, key, SignHttpMethod.Get);
                // Generates url signature for accessing specified object.
                var uri = client.GeneratePresignedUri(req);

                OssObject ossObject = client.GetObject(uri);
                using (var file = File.Open("fileToSave", FileMode.OpenOrCreate))
                {
                    using (Stream stream = ossObject.Content)
                    {
                        int length = 4 * 1024;
                        var buf    = new byte[length];
                        do
                        {
                            length = stream.Read(buf, 0, length);
                            file.Write(buf, 0, length);
                        } while (length != 0);
                    }
                }

                Console.WriteLine("Get object by signatrue succeeded.");
            }
            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);
            }
        }
Exemplo n.º 9
0
 public static string GetIamgeUri(string key, float width = 100, float height = 100)
 {
     try
     {
         var accessKeyId     = "LTAI4FfhUHPcQ1VHcKN5wEHc";
         var accessKeySecret = "F2zwYrZ4xKUwayfhXWXmthzLKiMXnp ";
         var endpoint        = @"oss-cn-zhangjiakou.aliyuncs.com";
         var bucketName      = "chakk";
         var client          = new OssClient(endpoint, accessKeyId, accessKeySecret);
         var process         = $"image/resize,m_fixed,w_{width},h_{height}";
         var req             = new GeneratePresignedUriRequest(bucketName, key, SignHttpMethod.Get)
         {
             Expiration = DateTime.Now.AddHours(64),
             Process    = process
         };
         var uri = client.GeneratePresignedUri(req);
         return(uri.ToString());
     }
     catch (Exception)
     {
         return("");
     }
 }
Exemplo n.º 10
0
        public Uri GetAssignedUri(string key)
        {
            Uri uri = null;

            if (!string.IsNullOrEmpty(key))
            {
                var client = new OssClient(this.config.OssEndPoint, this.config.AccessKeyId, this.config.AccessKeySecret);
                try
                {
                    var generatePresignedUriRequest = new GeneratePresignedUriRequest(this.config.Bucket, key, SignHttpMethod.Get)
                    {
                        Expiration = DateTime.Now.AddMinutes(this.config.Expiration),
                    };
                    uri = client.GeneratePresignedUri(generatePresignedUriRequest);
                }
                catch (Exception ex)
                {
                    Console.Write(ex.ToString());
                    throw new InternalException(ex.Message);
                }
            }
            return(uri);
        }
        public void GeneratePresignedUriStsTokenTest()
        {
            var targetObject = OssTestUtils.GetObjectKey(_className);

            try
            {
                var client = new OssClient(Config.Endpoint,
                                           new Common.Authentication.DefaultCredentialsProvider(
                                               new Common.Authentication.DefaultCredentials(Config.AccessKeyId, Config.AccessKeySecret, "test-token")));

                var gpuRequest = new GeneratePresignedUriRequest(_bucketName, targetObject, SignHttpMethod.Get)
                {
                    ContentType = "text/rtf",
                    Expiration  = DateTime.Now.AddHours(1),
                };
                var uri = client.GeneratePresignedUri(gpuRequest);
                Assert.AreNotEqual(uri.ToString().IndexOf("security-token=test-token"), -1);
            }
            catch
            {
                Assert.IsTrue(false);
            }

            var request = new GeneratePresignedUriRequest(_bucketName, targetObject, SignHttpMethod.Get)
            {
                ContentType = "text/rtf",
                Expiration  = DateTime.Now.AddHours(1),
            };

            request.BucketName = null;
            _ossClient.GeneratePresignedUri(request);

            request.BucketName = _bucketName;
            request.Key        = targetObject;
            _ossClient.GeneratePresignedUri(request);
        }
Exemplo n.º 12
0
 /// <summary>
 /// 获取图片的url,临时访问,1小时后过期
 /// </summary>
 /// <param name="orginFileName">原始文件名</param>
 /// <returns></returns>
 public static string GetTemporaryUrl(string orginFileName)
 {
     _logger.Info(orginFileName + ": 开始获取...");
     try
     {
         var result = GetImagsList(orginFileName);
         if (result.Count > 0)
         {
             // 找到需要的数据,结束查找
             var generatePresignedUriRequest = new GeneratePresignedUriRequest(bucketName, result[0], SignHttpMethod.Get)
             {
                 Expiration = DateTime.Now.AddHours(1),
             };
             var signedUrl = client.GeneratePresignedUri(generatePresignedUriRequest);
             return(signedUrl.ToString());
         }
         return(null);
     }
     catch (Exception ex)
     {
         _logger.Error(ex, ex.Message ?? "下载文件失败");
         return(null);
     }
 }
 public void GeneratePresignedUriWithExecptionTest()
 {
     try
     {
         var targetObject = OssTestUtils.GetObjectKey(_className);
         var gpuRequest   = new GeneratePresignedUriRequest(_bucketName, targetObject, SignHttpMethod.Head)
         {
             ContentType = "text/rtf",
             Expiration  = DateTime.Now.AddHours(1),
         };
         gpuRequest.UserMetadata.Add("Author", "oss");
         gpuRequest.UserMetadata.Add("Test", "test");
         gpuRequest.AddQueryParam("x-param-null", "");
         gpuRequest.AddQueryParam("x-param-space0", " ");
         gpuRequest.AddQueryParam("x-param-value", "value");
         gpuRequest.AddQueryParam("x-param-space1", " ");
         var uri = _ossClient.GeneratePresignedUri(gpuRequest);
         Assert.IsTrue(false);
     }
     catch
     {
         Assert.IsTrue(true);
     }
 }
Exemplo n.º 14
0
        public static void getObjectBySignedUrl()
        {
            const string accessKeyId     = "<your access key id>";
            const string accessKeySecret = "<your access key secret>";
            const string endpoint        = "<valid host name>";

            const string bucketName = "<bucket name>";
            const string key        = "<object name>";

            OssClient client = new OssClient(endpoint, accessKeyId, accessKeySecret);

            try
            {
                var metadata = client.GetObjectMetadata(bucketName, key);
                var etag     = metadata.ETag;

                var req = new GeneratePresignedUriRequest(bucketName, key, SignHttpMethod.Get);
                // Set optional properties(be blind to them usually)
                req.AddQueryParam("param1", "value1");
                req.ContentType = "text/html";
                req.ContentMd5  = etag;
                req.AddUserMetadata("mk1", "mv1");
                req.AddUserMetadata("mk2", "mv2");
                req.ResponseHeaders.CacheControl    = "No-Cache";
                req.ResponseHeaders.ContentEncoding = "utf-8";
                req.ResponseHeaders.ContentType     = "text/html";
                // Generates url signature for accessing specified object.
                var uri = client.GeneratePresignedUri(req);

                Console.WriteLine(uri.ToString());

                var webRequest = (HttpWebRequest)WebRequest.Create(uri);
                webRequest.ContentType = "text/html";
                webRequest.Headers.Add(HttpRequestHeader.ContentMd5, etag);
                webRequest.Headers.Add("x-oss-meta-mk1", "mv1");
                webRequest.Headers.Add("x-oss-meta-mk2", "mv2");
                var resp       = webRequest.GetResponse() as HttpWebResponse;
                var output     = resp.GetResponseStream();
                var bufferSize = 2048;
                var bytes      = new byte[bufferSize];
                try
                {
                    var length = 0;
                    do
                    {
                        length = output.Read(bytes, 0, bufferSize);
                        // to do something with bytes...
                    } while (length > 0);
                    output.Close();
                }
                catch (Exception ex)
                {
                    Console.WriteLine("ex : " + ex.Message);
                }
            }
            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);
            }
        }
        public static void PutStreamBySignedUrl(string bucketName, string key)
        {
            OssClient client = new OssClient(endpoint, accessKeyId, accessKeySecret);

            try
            {
                // Step1: Genereates url signature
                var generatePresignedUriRequest = new GeneratePresignedUriRequest(bucketName, key, SignHttpMethod.Put);
                var signedUrl = client.GeneratePresignedUri(generatePresignedUriRequest);

                // Step2: Prepares for stream to be uploaded and sends out this request.
                var buffer = Encoding.UTF8.GetBytes("Aliyun OSS SDK for C#");
                using (var ms = new MemoryStream(buffer))
                {
                    client.PutObject(signedUrl, ms);
                }

                Console.WriteLine("Get object by signatrue succeeded.");
            }
            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);
            }
        }
        public static void GenerateIamgeUri(string bucketName)
        {
            try
            {

                var process = "image/resize,m_fixed,w_100,h_100";
                var req = new GeneratePresignedUriRequest(bucketName, key, SignHttpMethod.Get)
                {
                    Expiration = DateTime.Now.AddHours(1),
                    Process = process
                };

                // 产生带有签名的URI
                var uri = client.GeneratePresignedUri(req);

                Console.WriteLine("Generate Presigned Uri:{0} with process:{1} succeeded ", uri, process);
            }
            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);
            }
        }
        public static void getObjectBySignedUrl2()
        {
            const string accessKeyId = "<your access key id>";
            const string accessKeySecret = "<your access key secret>";
            const string endpoint = "<valid host name>";

            const string bucketName = "<bucket name>";
            const string key = "<object name>";

            OssClient client = new OssClient(endpoint, accessKeyId, accessKeySecret);

            try
            {
                var metadata = client.GetObjectMetadata(bucketName, key);
                var etag = metadata.ETag;

                var req = new GeneratePresignedUriRequest(bucketName, key, SignHttpMethod.Get);
                // Generates url signature for accessing specified object.
                var uri = client.GeneratePresignedUri(req);

                Console.WriteLine(uri.ToString());

                OssObject ossObject = client.GetObject(uri);
                var file = File.Open("<file to hold object content>", FileMode.OpenOrCreate);
                Stream stream = ossObject.Content;
                byte[] bytes = new byte[stream.Length];
                stream.Read(bytes, 0, bytes.Length);
                file.Write(bytes, 0, bytes.Length);
            }
            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);
            }
        }
        public static void getObjectBySignedUrl()
        {
            const string accessKeyId = "<your access key id>";
            const string accessKeySecret = "<your access key secret>";
            const string endpoint = "<valid host name>";

            const string bucketName = "<bucket name>";
            const string key = "<object name>";

            OssClient client = new OssClient(endpoint, accessKeyId, accessKeySecret);

            try
            {
                var metadata = client.GetObjectMetadata(bucketName, key);
                var etag = metadata.ETag;

                var req = new GeneratePresignedUriRequest(bucketName, key, SignHttpMethod.Get);
                // Set optional properties(be blind to them usually)
                req.AddQueryParam("param1", "value1");
                req.ContentType = "text/html";
                req.ContentMd5 = etag;
                req.AddUserMetadata("mk1", "mv1");
                req.AddUserMetadata("mk2", "mv2");
                req.ResponseHeaders.CacheControl = "No-Cache";
                req.ResponseHeaders.ContentEncoding = "utf-8";
                req.ResponseHeaders.ContentType = "text/html";
                // Generates url signature for accessing specified object.
                var uri = client.GeneratePresignedUri(req);

                Console.WriteLine(uri.ToString());

                var webRequest = (HttpWebRequest)WebRequest.Create(uri);
                webRequest.ContentType = "text/html";
                webRequest.Headers.Add(HttpRequestHeader.ContentMd5, etag);
                webRequest.Headers.Add("x-oss-meta-mk1", "mv1");
                webRequest.Headers.Add("x-oss-meta-mk2", "mv2");
                var resp = webRequest.GetResponse() as HttpWebResponse;
                var output = resp.GetResponseStream();
                var bufferSize = 2048;
                var bytes = new byte[bufferSize];
                try
                {
                    var length = 0;
                    do
                    {
                        length = output.Read(bytes, 0, bufferSize);
                        // to do something with bytes...
                    } while (length > 0);
                    output.Close();
                }
                catch (Exception ex)
                {
                    Console.WriteLine("ex : " + ex.Message);
                }
            }
            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);
            }
        }
        public static void putObjectBySignedUrl()
        {
            const string accessKeyId = "<your access key id>";
            const string accessKeySecret = "<your access key secret>";
            const string endpoint = "<valid host name>";

            const string bucketName = "<bucket name>";
            const string key = "<object name>";

            //const string postData = "<your data to upload>";
            const string fileToUpload = "<file to upload>";

            OssClient client = new OssClient(endpoint, accessKeyId, accessKeySecret);

            try
            {
                // Puts object by using URL Signature Style(two steps included).
                // Step1: Genereates url signature
                var generatePresignedUriRequest = new GeneratePresignedUriRequest(bucketName, key, SignHttpMethod.Put);
                var signedUrl = client.GeneratePresignedUri(generatePresignedUriRequest);

                // Step2: Prepares for stream to be uploaded and sends out this request.
                //var buffer = Encoding.UTF8.GetBytes(postData);
                //PutObjectResult result = null;
                //using (var ms = new MemoryStream(buffer))
                //{
                //    result = client.PutObject(signedUrl, ms);
                //}

                // Step2: Prepares for filepath to be uploaded and sends out this request.
                var result = client.PutObject(signedUrl, fileToUpload);

                Console.WriteLine("Uploaded File's ETag: {0}", result.ETag);
            }
            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);
            }
        }
        public static void GetObjectBySignedUrlWithClient(string bucketName, string key)
        {
            try
            {
                var metadata = client.GetObjectMetadata(bucketName, key);
                var etag = metadata.ETag;

                var req = new GeneratePresignedUriRequest(bucketName, key, SignHttpMethod.Get);
                // Generates url signature for accessing specified object.
                var uri = client.GeneratePresignedUri(req);

                OssObject ossObject = client.GetObject(uri);
                using (var file = File.Open("fileToSave", FileMode.OpenOrCreate))
                {
                    using (Stream stream = ossObject.Content)
                    {
                        int length = 4 * 1024;
                        var buf = new byte[length];
                        do
                        {
                            length = stream.Read(buf, 0, length);
                            file.Write(buf, 0, length);
                        } while (length != 0);
                    }
                }

                Console.WriteLine("Get object by signatrue succeeded.");
            }
            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);
            }
        }
        public static void PutLocalFileBySignedUrl(string bucketName, string key)
        {
            OssClient client = new OssClient(endpoint, accessKeyId, accessKeySecret);

            try
            {
                // Step1: Genereates url signature
                var request = new GeneratePresignedUriRequest(bucketName, key, SignHttpMethod.Put);
                request.Expiration = DateTime.Now.AddMinutes(5); 

                var signedUrl = client.GeneratePresignedUri(request);

                // Step2: Prepares for filepath to be uploaded and sends out this request.
                client.PutObject(signedUrl, fileToUpload);

                Console.WriteLine("Put object by signatrue succeeded.");
            }
            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);
            }
        }
        private async Task <string> PresignedObjectAsync(string bucketName, string objectName, int expiresInt, PresignedObjectType type)
        {
            if (string.IsNullOrEmpty(bucketName))
            {
                throw new ArgumentNullException(nameof(bucketName));
            }
            if (string.IsNullOrEmpty(objectName))
            {
                throw new ArgumentNullException(nameof(objectName));
            }
            if (expiresInt <= 0)
            {
                throw new Exception("ExpiresIn time can not less than 0.");
            }
            if (expiresInt > 7 * 24 * 3600)
            {
                throw new Exception("ExpiresIn time no more than 7 days.");
            }
            long      nowTime       = (DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000000;
            const int minExpiresInt = 600;
            string    key           = Encrypt.MD5($"{bucketName}_{objectName}_{type.ToString().ToUpper()}");
            string    objectUrl     = null;

            //查找缓存
            if (Options.IsEnableCache && (expiresInt > minExpiresInt))
            {
                var cacheResult = await _cache.GetAsync <PresignedUrlCache>(key);

                PresignedUrlCache cache = cacheResult.HasValue ? cacheResult.Value : null;
                //缓存中存在,且有效时间不低于10分钟
                if (cache != null &&
                    cache.Type == type &&
                    cache.CreateTime > 0 &&
                    (cache.CreateTime + expiresInt - nowTime) > minExpiresInt &&
                    cache.Name == objectName &&
                    cache.BucketName == bucketName)
                {
                    return(cache.Url);
                }
            }
            if (type == PresignedObjectType.Get)
            {
                //生成URL
                AccessMode accessMode = await this.GetObjectAclAsync(bucketName, objectName);

                if (accessMode == AccessMode.PublicRead || accessMode == AccessMode.PublicReadWrite)
                {
                    string bucketUrl = await this.GetBucketEndpointAsync(bucketName);

                    objectUrl = $"{bucketUrl}{(objectName.StartsWith("/") ? "" : "/")}{objectName}";
                }
                else
                {
                    var req = new GeneratePresignedUriRequest(bucketName, objectName, SignHttpMethod.Get)
                    {
                        Expiration = DateTime.Now.AddSeconds(expiresInt)
                    };
                    var uri = _client.GeneratePresignedUri(req);
                    if (uri != null)
                    {
                        objectUrl = uri.ToString();
                    }
                }
            }
            else
            {
                var req = new GeneratePresignedUriRequest(bucketName, objectName, SignHttpMethod.Put)
                {
                    Expiration = DateTime.Now.AddSeconds(expiresInt)
                };
                var uri = _client.GeneratePresignedUri(req);
                if (uri != null)
                {
                    objectUrl = uri.ToString();
                }
            }
            if (string.IsNullOrEmpty(objectUrl))
            {
                throw new Exception("Presigned get object url failed.");
            }
            //save cache
            if (Options.IsEnableCache && expiresInt > minExpiresInt)
            {
                PresignedUrlCache urlCache = new PresignedUrlCache()
                {
                    Url        = objectUrl,
                    CreateTime = nowTime,
                    Name       = objectName,
                    BucketName = bucketName,
                    Type       = type
                };
                int randomSec = new Random().Next(5, 30);
                await _cache.SetAsync(key, urlCache, TimeSpan.FromSeconds(expiresInt + randomSec));
            }
            return(objectUrl);
        }