存储 - kuiyu/RsCode GitHub Wiki

本地服务器存储

引用RsCode.Storage.LocalStorage

使用服务

services.AddLocalStorage(Configuration);

七牛服务器存储

引用RsCode.Storage.QiniuStorage

使用服务

services.AddQiniuStorage(Configuration);

//七牛存储配置
  "QiniuStorage": {
    "UploadTokenUrl":"自定义的token获取地址", 
	"ManageTokenUrl":"自定义的token获取地址", 
	"DownloadTokenUrl":"自定义的token获取地址", 
    "AccessKey": "x",
    "SecretKey": "x",
    "Domain": "在七牛云存储配置的域名", //上传后资源地址,例:http://res.rscode.cn
    "Bucket": "在七牛云存储配置的bucket",
    "Zone": "bucket存储区域", //华东 ZONE_CN_East  华北 ZONE_CN_North 华南 ZONE_CN_South  北美 ZONE_US_North
    "UploadTokenExpireTime": 30, // 上传token有效时间单位:秒
    "DownloadTokenExpireTime": 5,//下载token有效时间
    "ManageTokenExpireTime": 5   //管理token有效时间
  }
  
  //本地存储配置 
  "LocalStorage": {
    "UploadTokenUrl":"自定义的token获取地址", //例 /storage/uptoken
	"UploadUrl": "https://localhost:5001/storage/upload",
    "AccessKey": "",//不填
    "SecretKey": "",//不填
    "Domain": "上传后资源地址", //上传后资源地址,例:http://res.rscode.cn
    "Bucket": "", //不填
    "Zone": "", //不填
    "UploadTokenExpireTime": 30, // 上传token有效时间单位:秒
    "DownloadTokenExpireTime": 5,//下载token有效时间
    "ManageTokenExpireTime": 5   //管理token有效时间
  }

自定义获取uptoken的逻辑 例:

public class StorageController : Controller
    {
        public IActionResult UpToken([FromServices]IEnumerable<IStorageProvider> providers,string key,string provider="qiniu")
        {
            var qiniu = providers.FirstOrDefault(s => s.StorageName == provider);
            var tokenInfo= qiniu.GetUploadToken(key,DateTime.Now.AddMinutes(4));
            return Json(tokenInfo);
        }
	[HttpPost]
        public async Task<IActionResult> Upload([FromServices] IEnumerable<IStorageProvider> providers)
        {
            var local = providers.FirstOrDefault(s => s.StorageName == "local");
            var tokenInfo= await local.UploadAsync();
            return Json(tokenInfo);
        }
    }

获取上传token的返回值: {domain:'合法域名',token:'上传token',upload_url:'上传地址'}

上传成功后的返回值 {res:'',key:'上传后的key'}

注意:使用本地上传时,在wwwroot文件夹中,确保保存文件的文件夹是存在的 razor页面,使用 @Html.Raw(info.UploadUrl)防止字符被转义

实例:

vue文件上传 html

@{
    Layout = null;
    ViewData["title"] = "上传demo";
    var info = ViewBag.TokenInfo as RsCode.Storage.TokenResult;
   
}
<el-upload class="avatar-uploader"
                   ref="upload"
                   :action="upload_url"
                   :data="upload_data"
                   :show-file-list="false"
                   :on-success="handleAvatarSuccess"
                   :on-error="handleError"
                   :before-upload="beforeAvatarUpload">
            <img v-if="imageUrl" :src="imageUrl" class="avatar">
            <i v-else class="el-icon-plus avatar-uploader-icon"></i>
        </el-upload>

js

<script src="https://unpkg.com/vue/dist/vue.js"></script>
<!-- import JavaScript -->
<script src="https://unpkg.com/element-ui/lib/index.js"></script>
<script>
    new Vue({
        el: '#app',
        data() {
            return {
                imageUrl: '',
                // 七牛云上传储存区域的上传域名(华东、华北、华南、北美、东南亚)
                upload_url: "@Html.Raw(info.UploadUrl)",
                domain:"@info.Domain",
                upload_data: {
                    key: "",
                    token:"@info.Token"
                }
            };
        },
        methods: {
            handleAvatarSuccess(res, file) {
                console.log('res=' + JSON.stringify(res));
                console.log('file=' + JSON.stringify(file));
                if (res.key && res.key.length > 0) {
                    let fileUrl = this.domain + res.key;
                    //本地url
                    //this.imageUrl = URL.createObjectURL(file.raw);
                    this.imageUrl = fileUrl;
                } else {
                    this.handleError(res);
                }
            },
            handleError: function (res) {
                this.$message({
                    message: "上传失败,请重试",
                    duration: 2000,
                    type: "warning"
                });

                if (res.error == "expired token")
                {
                    //重新获取token
                }
            },
            beforeAvatarUpload(file) {
                const isJPG = file.type === 'image/jpeg';
                const isLt2M = file.size / 1024 / 1024 < 2;

                if (!isJPG) {
                    this.$message.error('上传头像图片只能是 JPG 格式!');
                }
                if (!isLt2M) {
                    this.$message.error('上传头像图片大小不能超过 2MB!');
                }

                let key = file.name; // 文件资源名
                //wwwroot下准备好文件夹file
                key = 'file/' + Math.random().toString(36).substr(2) + '.' + key.split(".")[1];
                this.upload_data.key = key;
                return isJPG && isLt2M;
            },
            getUploadToken() {
                this.http.get("/storage?provider=qiniu&action=uptoken")
                    .then(ret => {
                        this.domain = ret.domain;
                        this.token = ret.token;
                    })
                    .catch(err => {

                    })
            } 
        }
    })
</script>

css

<style>
        .avatar-uploader .el-upload {
            border: 1px dashed #d9d9d9;
            border-radius: 6px;
            cursor: pointer;
            position: relative;
            overflow: hidden;
        }

            .avatar-uploader .el-upload:hover {
                border-color: #409EFF;
            }

        .avatar-uploader-icon {
            font-size: 28px;
            color: #8c939d;
            width: 178px;
            height: 178px;
            line-height: 178px;
            text-align: center;
        }

        .avatar {
            width: 178px;
            height: 178px;
            display: block;
        }
</style>
⚠️ **GitHub.com Fallback** ⚠️