阿里云存储OSS服务端签名客户端直传
1、阿里云存储服务端生成签名
public class OssHelper { internal class PolicyConfig { public string expiration { get; set; } public List> conditions { get; set; } } internal class PolicyToken { public string accessid { get; set; } public string policy { get; set; } public string signature { get; set; } public string dir { get; set; } public string host { get; set; } public string expire { get; set; } public string callback { get; set; } } internal class CallbackParam { public string callbackUrl { get; set; } public string callbackBody { get; set; } public string callbackBodyType { get; set; } } // 请填写您的AccessKeyId。 public static string accessKeyId = ""; // 请填写您的AccessKeySecret。 public static string accessKeySecret = ""; // host的格式为 bucketname.endpoint ,请替换为您的真实信息。 public static string host = "my-demo-bucket.oss-cn-hangzhou.aliyuncs.com"; // callbackUrl为 上传回调服务器的URL,请将下面的IP和Port配置为您自己的真实信息。 public static string callbackUrl = "http://88.88.88.88:8888"; // 用户上传文件时指定的前缀。 public static string uploadDir = "user-dir-prefix/"; public static int expireTime = 30; public static object GetPolicyToken() { //expireTime var expireDateTime = DateTime.Now.AddSeconds(expireTime); // example of policy //{ // "expiration": "2020-05-01T12:00:00.000Z", // "conditions": [ // ["content-length-range", 0, 1048576000] // ["starts-with", "$key", "user-dir-prefix/"] // ] //} //policy var config = new PolicyConfig(); config.expiration = FormatIso8601Date(expireDateTime); config.conditions = new List
>(); config.conditions.Add(new List
2、客户端调用
$('#file').change(function () { var file = $(this).get(0).files[0]; $.ajax({ url: '/api/oss/GetPolicyToken', type: 'get', dataType: 'json', success: sign => { //这里使用服务器签名方式,假设已经拿到服务器签名信息 let _date = new Date() * 1; let data = new FormData(); data.append("Filename", `${sign.dir}${file.name}`); data.append("key", `${sign.dir}${file.name}`); data.append("policy", sign.policy); data.append("OSSAccessKeyId", sign.accessid); data.append("success_action_status", 200); data.append("signature", sign.signature); data.append('file', file, file.name); $.ajax({ url: 'https://'+sign.host, type: 'POST', processData: false, contentType: false, data: data, success: result => { console.log(result) } }) } }) })
3、阿里云控制台OSS设置,允许跨域。
客户端直接上传节省了服务器带宽和性能,提升客户体验。