微信公众号开发

使用Azure Storage API 上传 文件解决微信小程序中上传图片的问题

本文主要是介绍使用Azure Storage API 上传 文件解决微信小程序中上传图片的问题,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

背景:

某微信小程序应用每天要上传海量图片,如果直接将图片上传到服务器,则可能收到服务器带宽限制导致并发数受限制。

本文介绍:

使用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:

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

 

设定CORS:

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

 

 

在PostMan中模拟如下:

PUT请求,Header中增加x-ms-blob-type:BlockBlob,URL为:

https://{StorageAccount_Name}.blob.core.windows.net/{container_name}/{blob_name}?{sas}

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

body 设定如下:

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

 


 

如果需要动态生成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记录:

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

 

 

添加自定义域

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

 

 

使用自定义域测试成功:

注意,此时只能选择http方式,同样创建sas时也要选择 支持 http 和 https

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

 

开启带HTTPS的自定义域名

对于开启HTTPS,则稍微复杂,必须开通CDN服务才可以为Azure Storage 开启https:

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

 

设置一些名称等必备参数:

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

 

在域名供应商处设置cname解析:

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

cname值在cdn页面可以看到:

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

 

 如下页面开启 https:

global版本Azure 可以由Azure CDN自动托管证书。国内版本暂时不支持。

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

 

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

 

等待一会全部部署完成:

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

 

完成后,显示https 成功:

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

 

部署完成后,可以在postman中测试:

注意此时的域名要使用 cdn.5gn.link:

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

 

 

特别注意:

由自定义域名设定的域名只能使用http协议

由Azure CDN设定的域名可以使用 http和https协议

二者互不干涉,关闭自定义域名Azure CDN仍然可以运行。

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

 

 

 

这篇关于使用Azure Storage API 上传 文件解决微信小程序中上传图片的问题的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!