阿里雲OSS Web端直傳 服務器簽名C#版


最近用到隊里OSS的文件上傳,然后阿里官方給的四個服務器簽名有Java PHP Python Go四個版本,就是沒C#(話說寫個C#有多難?) 百度了一下好像也沒有,既然這樣只能自己動手照着Java版本的改了.

下面是Java版的簽名代碼, 大概看一下就知道需要的是try代碼塊里的東西.

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String endpoint = "*";
        String accessId = "*";
        String accessKey = "*";
        String bucket = "*";
        String dir = "user-dir";
        String host = "http://" + bucket + "." + endpoint;
        OSSClient client = new OSSClient(endpoint, accessId, accessKey);

        try {
            long e = 30L;
            long expireEndTime = System.currentTimeMillis() + e * 1000L;
            Date expiration = new Date(expireEndTime);
            PolicyConditions policyConds = new PolicyConditions();
            policyConds.addConditionItem("content-length-range", 0L, 1048576000L);
            policyConds.addConditionItem(MatchMode.StartWith, "key", dir);
            String postPolicy = client.generatePostPolicy(expiration, policyConds);
            byte[] binaryData = postPolicy.getBytes("utf-8");
            String encodedPolicy = BinaryUtil.toBase64String(binaryData);
            String postSignature = client.calculatePostSignature(postPolicy);
            LinkedHashMap respMap = new LinkedHashMap();
            respMap.put("accessid", accessId);
            respMap.put("policy", encodedPolicy);
            respMap.put("signature", postSignature);
            respMap.put("dir", dir);
            respMap.put("host", host);
            respMap.put("expire", String.valueOf(expireEndTime / 1000L));
            JSONObject ja1 = JSONObject.fromObject(respMap);
            System.out.println(ja1.toString());
            response.setHeader("Access-Control-Allow-Origin", "*");
            response.setHeader("Access-Control-Allow-Methods", "GET, POST");
            this.response(request, response, ja1.toString());
        } catch (Exception var22) {
            Assert.fail(var22.getMessage());
        }

    }

  

下面是修改為C#版的代碼,如果報403錯誤記得設置Cors:

        public static string _id { get; } = "**********"; //AccessKeyId
        public static string _key { get; } = "**********************************"; //AccessKeySecret
        public static string _host { get; } = "http://*****.oss-cn-shenzhen.aliyuncs.com";

        // GET: Test
        [HttpGet]
        public JsonResult Index()
        {
            OssClient client = new OssClient(_host, _id, _key);
            DateTime now = DateTime.Now;
            DateTime ex = now.AddSeconds(30);
            PolicyConditions policyConds = new PolicyConditions();
            policyConds.AddConditionItem("content-length-range", 0L, 1048576000L);
            policyConds.AddConditionItem(MatchMode.StartWith, "key", "ic");

            String postPolicy = client.GeneratePostPolicy(ex, policyConds);
            byte[] binaryData = Encoding.Default.GetBytes(postPolicy);
            String encodedPolicy = Convert.ToBase64String(binaryData);
            //改到這里的時候遇到的一個坑 Java 里用的是SDK里: client.calculatePostSignature 方法生成簽名,但是.NET-SDK好像沒有用來生成簽名的方法(難道是我找的不夠仔細?).沒辦法又下載了PHP版本找到簽名那段:
            //$signature = base64_encode(hash_hmac('sha1', $string_to_sign, $key, true));

            var hmac = new HMACSHA1(Encoding.UTF8.GetBytes(_key));
            var hashBytes = hmac.ComputeHash(Encoding.UTF8.GetBytes(encodedPolicy));
            var Signature = Convert.ToBase64String(hashBytes);

            return Json(new
            {
                accessid = _id,
                policy = encodedPolicy,
                signature = Signature,
                dir = "ic",
                host = _host,
                expire = ConvertDateTimeInt(ex).ToString()
            }, JsonRequestBehavior.AllowGet);
        }

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM