using Aliyun.Acs.Core; using Aliyun.Acs.Core.Auth.Sts; using Aliyun.Acs.Core.Http; using Aliyun.Acs.Core.Profile; using Aliyun.OSS; using Furion; using Furion.DistributedIDGenerator; using Furion.HttpRemote; using Microsoft.AspNetCore.Http; using Microsoft.CodeAnalysis; using Microsoft.Extensions.Options; using System; using System.Diagnostics; using System.IO; using System.Threading.Tasks; namespace FlexJobApi.Core { /// /// 阿里云OSS工具 /// public static class AliyunOSSUtils { public static GetAliyunOSSAcsQueryResult GetOSSAcs() { var options = App.GetOptions().OSS; IClientProfile profile = DefaultProfile.GetProfile(options.RegionId, options.AccessKeyId, options.AccessSecret); DefaultAcsClient client = new DefaultAcsClient(profile); AssumeRoleRequest request = new AssumeRoleRequest(); request.Method = MethodType.POST; request.RoleArn = options.RoleArn; request.RoleSessionName = options.RoleSessionName; request.Policy = options.Policy; request.DurationSeconds = options.DurationSeconds; AssumeRoleResponse response = client.GetAcsResponse(request); var result = new GetAliyunOSSAcsQueryResult() { Expiration = response.Credentials.Expiration, OssAccessKeyId = response.Credentials.AccessKeyId, OssAccessSecret = response.Credentials.AccessKeySecret, SecurityToken = response.Credentials.SecurityToken, RequestId = response.RequestId }; return result; } /// /// 上传文件 /// /// /// /// /// public static AliyunOSSUploadResult Upload(string scene, string url, string filename = null) { if (filename.IsNull()) { filename = url.Substring(url.LastIndexOf('/') + 1); } var stream = App.GetRequiredService().GetAsStream(url); return Upload(scene, stream, filename); } /// /// 上传文件 /// /// /// /// /// public static AliyunOSSUploadResult Upload(string scene, IFormFile file, string filename = null) { var stream = file.OpenReadStream(); filename = filename ?? file.FileName; return Upload(scene, stream, filename); } /// /// 上传文件 /// /// /// /// /// public static AliyunOSSUploadResult Upload(string scene, Stream stream, string filename) { var options = App.GetOptions().OSS; var client = new OssClient(options.Endpoint, options.AccessKeyId, options.AccessSecret); var key = $"Resource/FlexJob/{scene}/{DateTime.Now:yyyy-MM-dd}/{DateTime.Now.ToTimeStamp()}-{IDGen.NextID()}/{filename}"; client.PutObject(options.BucketName, key, stream); var result = new AliyunOSSUploadResult { Url = key }; stream.Seek(0, SeekOrigin.Begin); result.Buffer = new byte[stream.Length]; stream.ReadExactly(result.Buffer); return result; } /// /// 获取Url /// /// /// /// public static string GetUrl(string url, string process = null) { var options = App.GetOptions().OSS; var client = new OssClient(options.Endpoint, options.AccessKeyId, options.AccessSecret); var req = new GeneratePresignedUriRequest(options.BucketName, url.TrimStart('/'), SignHttpMethod.Get) { Expiration = DateTime.Now.AddHours(1), Process = process }; url = client.GeneratePresignedUri(req).ToString(); return url; } } }