netcore3.1增加阿里雲OSS雲存儲服務


問題描述:由於最近的項目訪問量有點大,決定部署到兩台服務器,做負載的同時問題也發現了,之前的程序附件上傳是上傳到程序根目錄的,由於做了負載,網站訪問的資源就得看運氣了,多刷幾次才能訪問的到,於是乎干脆把資源文件都放到oss上面。

解決方案:先說一下整體思路,前台是jquery的,頁面加載獲取osstoken,有效期是10分鍾,獲取時候傳個參數,后台根據參數判斷文件存放位置,返回加密的token,前台拿到token就能給阿里雲oss上傳附件了。阿里雲文檔還是比較健全的,找了幾個開源的源碼關於oss上傳,照貓畫虎的來了一遍,慢慢摸索出了一些經驗,首先阿里有oss的sdk包(Aliyun.OSS.SDK.NetCore,當前是2.9.1版本),引用到項目中,添加服務類

public static class ALiOSSHelper
    {
        private static readonly ILog FileLog = LogManager.GetLogger("NETCoreRepository", typeof(ALiOSSHelper));

        private const string AccessKeyID = "XXX";
        private const string AccessKeySecret = "XXX";
        private const string Host = "http://XXX.oss-cn-beijing.aliyuncs.com";
        private const string BucketName = "XXX";

        public static ALiOSSTokenModel GetToken(int fileType)
        {
            var TargetDir = "FruitsCMS";
            switch (fileType)
            {
                //資訊圖片
                case 1:
                    TargetDir += "/NewsPic";
                    break;
                //輪播圖
                case 2:
                    TargetDir += "/ScrollPic";
                    break;
                //友情鏈接Logo
                case 3:
                    TargetDir += "/LinkPic";
                    break;
                default:
                    TargetDir += "/UploadImage";
                    break;
            }
            OssClient client = new OssClient(Host, AccessKeyID, AccessKeySecret);
            //密鑰過期時間為10分鍾
            var expiration = DateTime.Now.AddMinutes(10);
            var policyConds = new PolicyConditions();
            policyConds.AddConditionItem("bucket", BucketName);
            policyConds.AddConditionItem(MatchMode.StartWith, PolicyConditions.CondKey, TargetDir);
            policyConds.AddConditionItem(MatchMode.StartWith, "x-oss-meta-tag", "dummy_etag");
            //限制傳輸文件大小10M
            policyConds.AddConditionItem(PolicyConditions.CondContentLengthRange, 1, 10240000);
            var postPolicy = client.GeneratePostPolicy(expiration, policyConds);
            var encPolicy = Convert.ToBase64String(Encoding.UTF8.GetBytes(postPolicy));
            var signature = ComputeSignature(AccessKeySecret, encPolicy);
            var tempRet = new ALiOSSTokenModel
            {
                key = TargetDir,
                bucket = BucketName,
                OSSAccessKeyId = AccessKeyID,
                policy = encPolicy,
                Signature = signature
            };
            FileLog.Info("返回阿里雲OSSToken信息:" + tempRet.ToJson());
            return tempRet;
        }

        private static string ComputeSignature(string key, string data)
        {
            using (var algorithm = KeyedHashAlgorithm.Create("HmacSHA1".ToUpperInvariant()))
            {
                algorithm.Key = Encoding.UTF8.GetBytes(key.ToCharArray());
                return Convert.ToBase64String(
                    algorithm.ComputeHash(Encoding.UTF8.GetBytes(data.ToCharArray())));
            }
        }
    }
返回給前台的對象模型
    public class ALiOSSTokenModel
    {
        public string key { get; set; }

        public string bucket { get; set; }

        public string OSSAccessKeyId { get; set; }

        public string policy { get; set; }

        public string Signature { get; set; }
    }

最小改動原則,在頁面底部增加一個單獨的上傳文件隱藏form,接口返回模型賦值即可

<form id="form2" action="http://XXX-cn-beijing.aliyuncs.com" method="POST" enctype="multipart/form-data">
    <input type="hidden" id="key" name="key" />
    <input type="hidden" id="bucket" name="bucket" />
    <input type="hidden" id="x-oss-meta-tag" name="x-oss-meta-tag" value="dummy_etag_xxx" />
    <input type="hidden" id="OSSAccessKeyId" name="OSSAccessKeyId" />
    <input type="hidden" id="policy" name="policy" />
    <input type="hidden" id="Signature" name="Signature" />
    <input type="file" id="file" name="file" accept="image/*" style="display:none;">
</form>
    function loadOssTokenInfo() {
        $.ajax({
            url: "/Upload/GetOSSToken?fileType=3",
            dataType: "json",
            async: false,
            success: function (data) {
                $("#form2").formSerialize(data);
            }
        });
    }
    function initControl() {
        $("#Status").bindSelect();
        $("#file").change(function () {
            var f = document.getElementById("file").files;
            if (f.length == 0) {
                $("#PicAddr").val("");
            } else {
                var tempFile = $("#file").val();
                var tempFilePath = $("#key").val();
                var tempNewFile = tempFilePath + "/" + random_string() + get_suffix(tempFile);
                $("#key").val(tempNewFile);
                $('#form2').ajaxSubmit({
                    dataType: 'json',
                    success: function () {
                        $("#PicAddr").val("https://XXX/" + tempNewFile);
                    },
                    error: function () {
                        $.modalAlert("上傳失敗,請稍候重試", "error");
                    }
                });
            }
        });
        this.loadOssTokenInfo();
    }

代碼順序有點凌亂,大概就是這樣的思路,還遇到一個問題就是編輯器里的圖片上傳,我用的tinymce,在里面的upload插件里照住這個改一通,有個要注意的就是form里的id是需要設置不一樣的,方便賦值與取值,但不影響表單提交的,去oss后台設置一些圖片處理的方法,比如裁切、水印等,前台調用直接多加個后綴就ok了,大功告成,哦了。


免責聲明!

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



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