背景:
某微信小程序应用每天要上传海量图片,如果直接将图片上传到服务器,则可能收到服务器带宽限制导致并发数受限制。
本文介绍:
使用Azure Storage Rest API 上传文件。
Azure Storage Account 为每个文件提供了据说“40MB/S”的带宽(此数据来源于网络仅供参考,未从微软官网找到相关数据),如果小程序的上传图片直接上传到Azure Storage Account 则可以大幅降低服务器的带宽压力。
两种方案供参考:
方案 一:
在小程序中调用Azure Storage Account 的JS SDK 上传文件,因为我手里没有微信小程序可供测试,故不确定是否可行(似乎小程序对第三方JS有些特定的要求)。
Azure Storage Account JS SDK下载地址:
https://docs.microsoft.com/zh-cn/azure/storage/blobs/quickstart-blobs-javascript-browser?WT.mc_id=AZ-MVP-5003757
方案二:
在小程序中直接调用Azure Storage Account 的REST API 中的PUT请求直接上传文件:
需要使用SAS:
设定CORS:
在PostMan中模拟如下:
PUT请求,Header中增加x-ms-blob-type:BlockBlob,URL为:
https://{StorageAccount_Name}.blob.core.windows.net/{container_name}/{blob_name}?{sas}
body 设定如下:
如果需要动态生成sas,则可参照如下连接:
https://docs.microsoft.com/zh-cn/azure/storage/common/storage-account-sas-create-dotnet?toc=%2Fazure%2Fstorage%2Fblobs%2Ftoc.json&WT.mc_id=AZ-MVP-5003757
示例代码如下:
private static string GetAccountSASToken(StorageSharedKeyCredential key)
{
// Create a SAS token that's valid for one hour.
AccountSasBuilder sasBuilder = new AccountSasBuilder()
{
Services = AccountSasServices.Blobs | AccountSasServices.Files,
ResourceTypes = AccountSasResourceTypes.Service,
ExpiresOn = DateTimeOffset.UtcNow.AddHours(1),
Protocol = SasProtocol.Https
};
sasBuilder.SetPermissions(AccountSasPermissions.Read |
AccountSasPermissions.Write);
// Use the key to get the SAS token.
string sasToken = sasBuilder.ToSasQueryParameters(key).ToString();
Console.WriteLine("SAS token for the storage account is: {0}", sasToken);
Console.WriteLine();
return sasToken;
}
小程序要求使用 https 及 ICP备案:
可参照如下连接对Azure Storage 进行非https的自定义域名设置(这种设置小程序不能使用):
上传完成后,可以使用默认的主终结点访问网站:
设置域名解析
本例中我们将设置将storage.5gn.link CNAME到 storage account 的默认uri。
登录域名控制台,本例中我们的域名在阿里云, 添加CNAME记录:
添加自定义域
使用自定义域测试成功:
注意,此时只能选择http方式,同样创建sas时也要选择 支持 http 和 https
开启带HTTPS的自定义域名
对于开启HTTPS,则稍微复杂,必须开通CDN服务才可以为Azure Storage 开启https:
设置一些名称等必备参数:
在域名供应商处设置cname解析:
cname值在cdn页面可以看到:
如下页面开启 https:
global版本Azure 可以由Azure CDN自动托管证书。国内版本暂时不支持。
等待一会全部部署完成:
完成后,显示https 成功:
部署完成后,可以在postman中测试:
注意此时的域名要使用 cdn.5gn.link:
特别注意:
由自定义域名设定的域名只能使用http协议
由Azure CDN设定的域名可以使用 http和https协议
二者互不干涉,关闭自定义域名Azure CDN仍然可以运行。