sunpengfei
3 天以前 5b86cd10f893872da68c040adea52953eb25c4a0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
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
{
    /// <summary>
    /// 阿里云OSS工具
    /// </summary>
    public static class AliyunOSSUtils
    {
        public static GetAliyunOSSAcsQueryResult GetOSSAcs()
        {
            var options = App.GetOptions<AliyunOptions>().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;
        }
 
        /// <summary>
        /// 上传文件
        /// </summary>
        /// <param name="scene"></param>
        /// <param name="url"></param>
        /// <param name="filename"></param>
        /// <returns></returns>
        public static AliyunOSSUploadResult Upload(string scene, string url, string filename = null)
        {
            if (filename.IsNull())
            {
                filename = url.Substring(url.LastIndexOf('/') + 1);
            }
            var stream = App.GetRequiredService<IHttpRemoteService>().GetAsStream(url);
            return Upload(scene, stream, filename);
        }
 
        /// <summary>
        /// 上传文件
        /// </summary>
        /// <param name="url"></param>
        /// <param name="key"></param>
        /// <returns></returns>
        public static AliyunOSSUploadResult Upload(string url, string key)
        {
            var stream = App.GetRequiredService<IHttpRemoteService>().GetAsStream(url);
            return Upload(stream, key);
        }
 
        /// <summary>
        /// 上传文件
        /// </summary>
        /// <param name="scene"></param>
        /// <param name="file"></param>
        /// <param name="filename"></param>
        /// <returns></returns>
        public static AliyunOSSUploadResult Upload(string scene, IFormFile file, string filename = null)
        {
            var stream = file.OpenReadStream();
            filename = filename ?? file.FileName;
            return Upload(scene, stream, filename);
        }
 
        /// <summary>
        /// 上传文件
        /// </summary>
        /// <param name="scene"></param>
        /// <param name="stream"></param>
        /// <param name="filename"></param>
        /// <returns></returns>
        public static AliyunOSSUploadResult Upload(string scene, Stream stream, string filename)
        {
            var key = $"Resource/FlexJob/{scene}/{DateTime.Now:yyyy-MM-dd}/{DateTime.Now.ToTimeStamp()}-{IDGen.NextID()}/{filename}";
            return Upload(stream, key);
        }
 
        /// <summary>
        /// 上传文件
        /// </summary>
        /// <param name="stream"></param>
        /// <param name="key"></param>
        /// <returns></returns>
        public static AliyunOSSUploadResult Upload(Stream stream, string key)
        {
            var options = App.GetOptions<AliyunOptions>().OSS;
            var client = new OssClient(options.Endpoint, options.AccessKeyId, options.AccessSecret);
            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;
        }
 
        /// <summary>
        /// 获取Url
        /// </summary>
        /// <param name="url"></param>
        /// <param name="process"></param>
        /// <returns></returns>
        public static string GetUrl(string url, string process = null)
        {
            var options = App.GetOptions<AliyunOptions>().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;
        }
    }
}