阿里云存储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设置,允许跨域。
客户端直接上传节省了服务器带宽和性能,提升客户体验。