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;
}
}
}