抖音粉丝群1
『7x24小时有问必答』

AI浪潮下的计算机行业——从业者现状与未来展望
OnceMi.AspNetCore.OSS
Asp.Net Core 5.0/6.0对象储存扩展包,支持Minio自建对象储存、阿里云OSS、腾讯云COS、七牛云Kodo。支持OSS常规操作,比如储存桶创建,删除、对象上传、下载、生成签名URL等。支持.NET 5/6,也推荐升级至.NET 5/6.
OSS 文档
Minio: 点此查看    [1]    

Aliyun: 点此查看    [2]    

QCloud: 点此查看    [3]    
       

问题
    Minio通过Nginx发反向代理后直接通过域名(默认443端口)调用存在问题,应该是Minio本身问题,有兴趣的可以自行测试研究,具体信息我已经发布在Issue中。
    腾讯云
    PutObjectAsync
    流式上传接口,有非常低的概率会抛“储存桶不存在的异常”,应该是腾讯云自身的原因,具体原因未知。
如何使用
1、Install OnceMi.AspNetCore.OSS。

Cmd install:
dotnet add package OnceMi.AspNetCore.OSS

Nuget:OnceMi.AspNetCore.OSS
2、Configuration

You need to configure OSSService in your Startup.cs:
//default minio

//添加默认对象储存配置信息

services.AddOSSService(option =>

{

    option.Provider = OSSProvider.Minio;

    option.Endpoint = "oss.oncemi.com:9000";

    option.AccessKey = "Q*************9";

    option.SecretKey = "A**************************Q";

    option.IsEnableHttps = true;

    option.IsEnableCache = true;

});

//aliyun oss

//添加名称为‘aliyunoss’的OSS对象储存配置信息

services.AddOSSService("aliyunoss", option =>

 {

     option.Provider = OSSProvider.Aliyun;

     option.Endpoint = "oss-cn-hangzhou.aliyuncs.com";

     option.AccessKey = "L*******************U";

     option.SecretKey = "5*******************************T";

     option.IsEnableCache = true;

 });

//qcloud oss

//从配置文件中加载节点为‘OSSProvider’的配置信息

services.AddOSSService("QCloud""OSSProvider");

可注入多个OSSService,不同的Service用名称来区分。需要注意的是,腾讯云COS中配置节点Endpoint表示AppId。
配置文件实例:
{

  "OSSProvider": {

    "Provider""QCloud"//枚举值支持:Minio/Aliyun/QCloud

    "Endpoint""你的AppId"//腾讯云中表示AppId

    "Region""ap-chengdu",  //地域

    "AccessKey""A****************************z",

    "SecretKey""g6I***************la",

    "IsEnableCache"true  //是否启用缓存,推荐开启

  }

}

3、Use
/// 

/// 使用默认的配置文件

/// 

public class HomeController : Controller

{

    private readonly ILogger _logger;

    private readonly IOSSService _OSSService;

    private readonly string _bucketName = "default-dev";

    public HomeController(ILogger logger

        , IOSSService OSSService
)

    {

        _logger = logger;

        _OSSService = OSSService;

    }

}

/// 

/// 获取IOSSServiceFactory,根据名称创建对应的OSS服务

/// 

public class QCloudController : Controller

{

    private readonly ILogger _logger;

    private readonly IOSSService _OSSService;

    private readonly string _bucketName = "default-dev";

    public QCloudController(ILogger logger

        , IOSSServiceFactory ossServiceFactory
)

    {

        _logger = logger;

        _OSSService = ossServiceFactory.Create("QCloud");

    }

}

列出bucket中的全部文件
public async Task ListBuckets()

{

    try

    {

        var result = await _OSSService.ListBucketsAsync();

        return Json(result);

    }

    catch (Exception ex)

    {

        return Content(ex.Message);

    }

}

Option Params
名称类型说明案例备注Provider枚举OSS提供者Minio允许值:Minio,Aliyun, QCloudEndpointstring节点oss-cn-hangzhou.aliyuncs.com在腾讯云OSS中表示AppIdAccessKeystringAccessKeyF...............s

SecretKeystringSecretKeyv...............d

Regionstring地域ap-chengdu

SessionTokenstringtoken

仅Minio中使用IsEnableHttpsbool是否启用HTTPStrue建议启用IsEnableCachebool是否启用缓存true启用后将缓存签名URL,以减少请求次数
API Reference
BucketExistsAsync
Task BucketExistsAsync(string bucketName);
判断该储存桶是否存在。
CreateBucketAsync
Task CreateBucketAsync(string bucketName);
创建一个储存桶。如果当前储存桶存在,将抛出异常
BucketExistException
ListBucketsAsync
Task ListBucketsAsync();
列出当前账号下允许访问的所有储存桶。
RemoveBucketAsync
Task RemoveBucketAsync(string bucketName);
移除当前储存桶。移除储存桶之前,请先移除储存桶中所有的对象和对象碎片文件。
SetBucketAclAsync
Task SetBucketAclAsync(string bucketName, AccessMode mode);
设置储存桶的外部访问权限,支持的权限有:私有、公共读、公共读写。返回设置结果(True or False)。
GetBucketAclAsync
Task GetBucketAclAsync(string bucketName);
获取储存桶的外部访问权限。
ObjectsExistsAsync
Task ObjectsExistsAsync(string bucketName, string objectName);
获取指定储存桶中指定对象是否存在。
ListObjectsAsync
Task> ListObjectsAsync(string bucketName, string prefix = null);
列出当前储存桶所有文件。如果储存桶中文件较多,可以需要较长的执行时间,因此推荐填写prefix参数,prefix会根据文件名称进行前端匹配。比如输出abc,则列出全部abc开头的文件或目录。
GetObjectAsync
获取文件的数据流。

Methos 1:
Task GetObjectAsync(string bucketName, string objectName, Action callback, CancellationToken cancellationToken = default);
Example
try

{

    await _OSSService.GetObjectAsync(_bucketName, "1.jpg", (stream) =>

    {

        using (FileStream fs = new FileStream("1.jpg", FileMode.Create, FileAccess.Write))

        {

            stream.CopyTo(fs);

            fs.Close();

        }

    });

    return Json("OK");

}

catch (Exception ex)

{

    throw ex;

}

Methos 2:
Task GetObjectAsync(string bucketName, string objectName, string fileName, CancellationToken cancellationToken = default);
Example
try

{

    await _OSSService.GetObjectAsync(_bucketName, "1.jpg""C:\\Temp\\1.jpg");

    return Json("OK");

}

catch (Exception ex)

{

    throw ex;

}

PutObjectAsync
上传文件。支持流式上传和上传本地文件。腾讯云不止流式上传,为了兼容接口,采用先将流加载到内存中再上传。
Method 1(流式上传):
Task PutObjectAsync(string bucketName, string objectName, Stream data, CancellationToken cancellationToken = default(CancellationToken));
Example
try

{

    byte[] bs = System.IO.File.ReadAllBytes(@"C:\Users\sysru\Desktop\PHOTO-1.jpg");

    using (MemoryStream filestream = new MemoryStream(bs))

    {

        await _OSSService.PutObjectAsync(_bucketName, "PHOTO-1.jpg", filestream);

    }

    return Json("OK");

}

catch (Exception ex)

{

    throw;

}

Method 2(上传本地文件):
Task PutObjectAsync(string bucketName, string objectName, string filePath, CancellationToken cancellationToken = default);
Example
try

{

    await _OSSService.PutObjectAsync(_bucketName, "PHOTO-1.jpg"@"C:\Users\sysru\Desktop\PHOTO-1.jpg");

    return Json("OK");

}

catch (Exception ex)

{

    throw;

}

GetObjectMetadataAsync
Task GetObjectMetadataAsync(string bucketName

    , string objectName

    , string versionID = null

    , string matchEtag = null

    , DateTime? modifiedSince = null
)
;

获取对象的元数据,或根据VersionId获取对象元数据。需要注意的是,在阿里云对象存储和腾讯云对象存储中不支持matchEtag和modifiedSincecan参数。
CopyObjectAsync
Task CopyObjectAsync(string bucketName, string objectName, string destBucketName, string destObjectName = null);
在储存桶之间复制对象。
RemoveObjectAsync
Task RemoveObjectAsync(string bucketName, string objectName);
删除储存桶中指定对象。
Task RemoveObjectAsync(string bucketName, List objectNames);
删除储存桶中多个对象。
RemovePresignedUrlCache
void RemovePresignedUrlCache(string bucketName, string objectName);
清除对象生成的签名URL缓存。在未开启签名URL缓存的情况下,此功能无效。
PresignedGetObjectAsync
Task PresignedGetObjectAsync(string bucketName, string objectName, int expiresInt);
生成一个给HTTP GET请求用的presigned URL。浏览器/移动端的客户端可以用这个URL进行下载,即使其所在的存储桶是私有的。这个presigned URL可以设置一个失效时间,且不能超过7天。

如果该对象拥有公共读权限或该对象继承了储存桶的公共读权限,将生成永久下载链接。

如果Option参数中设置为IsEnableCache为True,将会在有效时间中缓存生成的签名链接,同时也推荐开启此功能,将大大降低请求的频率。
PresignedPutObjectAsync
Task PresignedPutObjectAsync(string bucketName, string objectName, int expiresInt);
生成一个给HTTP PUT请求用的presigned URL。浏览器/移动端的客户端可以用这个URL进行上传,即使其所在的存储桶是私有的。这个presigned URL可以设置一个失效时间,且不能超过7天。

如果Option参数中设置为IsEnableCache为True,将会在有效时间中缓存生成的签名链接,同时也推荐开启此功能,将大大降低请求的频率。

注意:七牛云对象储存不支持此操作!
SetObjectAclAsync
Task SetObjectAclAsync(string bucketName, string objectName, AccessMode mode);
设置对象的访问权限,默认文件的访问权限是继承储存桶的。但是可以单独通过此API为对象设置访问权限。

注意:七牛云对象储存不支持此操作!
GetObjectAclAsync
Task GetObjectAclAsync(string bucketName, string objectName);
获取对象的储存桶权限,如果是该权限继承自储存桶,获取的可能是储存桶对当前对象的访问权限。

注意:七牛云对象储存不支持此操作!
RemoveObjectAclAsync
Task RemoveObjectAclAsync(string bucketName, string objectName);
清除该对象的访问权限或将其恢复至继承权限。

注意:七牛云对象储存不支持此操作!
Dependencies
    Aliyun.OSS.SDK.NetCore
    Microsoft.Extensions.Caching.Memory
    Newtonsoft.Json
    Tencent.QCloud.Cos.Sdk
项目地址
https://gitee.com/oncemi/oncemi_aspnetcore_oss
参考资料
[1]
点此查看: https://docs.min.io/docs/dotnet-client-api-reference.html
[2]
点此查看: https://help.aliyun.com/document_detail/32085.html
[3]
点此查看: https://cloud.tencent.com/document/product/436/32819


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

上一主题上一主题         下一主题下一主题
QQ手机版小黑屋粤ICP备17165530号

Copyright 2010-2015. All rights reserved. 

微信公众号二维码 抖音二维码 百家号二维码 今日头条二维码哔哩哔哩二维码