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(HttpMethods));

        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了,大功告成,哦了。

原文地址:https://www.cnblogs.com/wangbg/p/12550036.html

时间: 2024-11-06 20:12:07

netcore3.1增加阿里云OSS云存储服务的相关文章

iOS使用阿里云OSS对象存储 (SDK 2.1.1)

最近项目中用到了阿里云OSS对象存储,用来存储APP中图片.音频等一些数据.但坑爹的阿里云居然在11月20日将SDK版本更新到了2.1.1,然而网上给出的教程都是1.*版本的(针对iOS),两个版本所调用的方法差别较大(自我感觉),当然原理都一样.所以看了两天SDK,自己封装了几个常用的方法. 一.OSS简单介绍 OSS是提供非结构化数据存取的服务,非结构化数据一般包括图片.文档.音频.视频等一些文件.OSS提供了接口,开发者可以通过这些接口对数据进行上传或下载等操作. 开通OSS服务后,创建一

阿里云的NoSQL存储服务OTS的应用分析

这篇文章主要介绍了阿里云的NoSQL存储服务OTS的应用分析,OTS作为阿里巴巴开发的NoSQL存储技术服务现已面向用户商业化,需要的朋友可以参考下. 1. 概要  OTS是构建在阿里云飞天分布式系统上的NoSQL存储服务,提供海量结构化数据的存储和实时访问.OTS以实例和表来组织数据,通过自动的数据分区和负载均衡技术,对应用提供规模(数据和访问)的无缝扩展.应用通过调用OTS API/SDK或者操作管理控制台来使用OTS服务.OTS服务具有以下几个主要的特点:  规模可扩展:OTS具备可扩展的

腾讯云cos对象存储服务文件上传api就是一个大坑

一.介绍 对象存储服务(Cloud Object Service)是基于腾讯多年海量服务经验,对外提供的可靠.安全.易用的海量存储服务.提供多样化接入方式,以及全国部署的上传加速集群,可以无缝衔接CDN进行加速下载. 二.cos 文件上传api源码 /** * 单个文件上传,适用于小文件 * * @param bucketName * bucket名称 * @param remotePath * 远程文件路径 * @param localPath * 本地文件路径 * @return 服务器端返

阿里云oss云存储-----ossutil工具的使用

1.ossutil工具的安装: ossutil工具旨在为用户提供一个方便的,以命令行方式管理OSS数据的途径.当前版本未提供完整的Bucket管理功能和Multipart管理功能,相关功能会在后续版本中开发.现在如果有使用上述功能的需要,可以先使用osscmd命令行工具. 下载地址:https://help.aliyun.com/document_detail/50452.html?spm=a2c4g.11186623.6.1164.ffec44c5Ykfd8W 这里有对应的版本可以让你进行选择

阿里云OSS对象存储内容增量备份到本地

#!/usr/bin/python3 #-*-coding:utf-8-*- #key :OSS文件名称 #bucket :存储空间名称 import oss2 auth = oss2.Auth('阿里id', '密码') bucket = oss2.Bucket(auth, 'http://oss-cn-shenzhen.aliyuncs.com', 'bucket名称') #操作完文件自动关闭 with open('file.txt','r+') as f: #读取一整行文件包括回车换行 o

阿里云 OSS文件存储挂到云服务器ESC文件系统中

ossfs能让您在Linux系统中,将对象存储OSS的存储空间(Bucket)挂载到本地文件系统中,您能够像操作本地文件一样操作OSS的对象(Object),实现数据的共享. 使用限制 ossfs使用有以下限制: 不支持挂载归档型Bucket. 编辑已上传文件会导致文件被重新上传. 元数据操作,例如list directory,因为需要远程访问OSS服务器,所以性能较差. 重命名文件/文件夹可能会出错.若操作失败,可能会导致数据不一致. 不适合高并发读/写的场景. 多个客户端挂载同一个OSS B

使用阿里云OSS上传文件

本文介绍如何利用Java API操作阿里云OSS对象存储. 1.控制台操作 首先介绍一下阿里云OSS对象存储的一些基本概念. 1.1 进入对象存储界面 登录阿里云账号,进入对象存储界面,如图所示. 进入后如图所示. 1.2 OSS基本概念 这里不过多介绍如何在阿里云上传下载文件,这些操作基本上点一点都能找到. 1.2.1 Bucket Bucket实质就是阿里云OSS对象存储的一个存储空间,按照计算机理解的话可以理解为一个磁盘(不知道这样比喻是否恰当). 创建桶的过程很简单,如图所示,填写对应内

阿里云 OSS 如何设置防盗链, 上个月图床流量耗费50G+,请求次数10W+,什么鬼?

欢迎关注个人微信公众号: 小哈学Java, 文末分享阿里 P8 高级架构师吐血总结的 <Java 核心知识整理&面试.pdf>资源链接!! 个人网站: https://www.exception.site/essay/how-to-set-aliyun-oss-http-referer 目录 一.背景 二.背后有啥猫腻 三.什么是盗链? 四.为什么会被盗链? 五.OSS 设置防盗链 六.验证一下效果 七.另外一些应对手段 一.背景 小哈前天陆续接到三个电话,但都因为忙于工作.下雨天等各

(转)云存储:阿里云OSS 、又拍云和 七牛 的比较

阿里OSS:好处就是,那是一套完整的体系,存储,数据库,CDN,服务器,阿里都可以给你全包.缺点,费用对于没有盈利的网站来说太高了,好像定位就是给那些高端客户使用的,而且CDN,OSS的流量是分开收费,带宽(2倍成本,呵呵).又拍云:算是老牌静态存储服务商,自带有CDN.存储空间可以弹性增加(不知道可不可以弹性减少,我只是免费使用了一下).费用计算公式(空间和流量),请求次数是免费.可免费试用7天.开源的程序(DZ,PW,WP)都有插件,也可以直接使用FTP,对于技术上要求不是太高就可以使用.七