Azure API 管理重命名文件
Azure API Management rename file
目前我们有前端将文件发送到 Azure 存储帐户到特定的 blob 容器中。前端通过一个人从存储帐户获取 SAS 并将其粘贴到前端代码中,从而手动将 SAS 令牌放入构建中,以便它可以读取和写入存储帐户。
我们想让前端向 APIM 发送一个带有文件的请求。然后我们想要对该文件进行哈希处理,使用该哈希作为名称并将其存储在 Azure Blob 存储中。我是 Azure API 管理的新手,这可能吗?上传的文件好像看不到了
在 APIM 策略中,我目前拥有对存储帐户的授权,但我不知道如何像通常在 MVC 应用程序中那样获得 Request.Files
。
我一直在寻找 https://docs.microsoft.com/ as well as https://techcommunity.microsoft.com/ 和 SO 我什至已经开始寻找 Google 搜索结果的第二页。我找不到任何表明这可能与否的信息。
这是我目前的政策。它的工作原理是前端可以点击它并通过一个文件并保存该文件。但是我们想对文件进行哈希处理并使用该哈希作为名称以避免 Azure 存储帐户 blob 容器中的名称冲突
<policies>
<inbound>
<base />
<set-variable name="UTCNow" value="@(DateTime.UtcNow.ToString("R"))" />
<set-variable name="Verb" value="@(context.Request.Method)" />
<set-variable name="documentstorage" value="{{documentstorage}}" />
<set-variable name="documentstoragekey" value="{{documentstorageaccesskey}}" />
<set-variable name="version" value="2019-12-12" />
<set-variable name="bodySize" value="@(context.Request.Headers["Content-Length"][0])" />
<set-variable name="contentType" value="@(context.Request.Headers["Content-Type"][0])" />
<set-header name="x-ms-version" exists-action="override">
<value>@((string)context.Variables["version"] )</value>
</set-header>
<set-header name="x-ms-blob-type" exists-action="override">
<value>BlockBlob</value>
</set-header>
<set-header name="date" exists-action="override">
<value>@((string)context.Variables["UTCNow"])</value>
</set-header>
<set-header name="Authorization" exists-action="override">
<value>@{
var account = (string)context.Variables["documentstorage"];
var key = (string)context.Variables["documentstoragekey"];
var verb = (string)context.Variables["Verb"];
var container = context.Request.MatchedParameters["container"];
var fileName = context.Request.MatchedParameters["fileName"];
var dateNow = (string)context.Variables["UTCNow"];
string contentType = (string)context.Variables["contentType"];//"application/pdf";
var contentLength = (string)context.Variables["bodySize"];
var stringToSign = string.Format("{0}\n\n\n{1}\n\n{2}\n{3}\n\n\n\n\n\nx-ms-blob-type:BlockBlob\nx-ms-version:{4}\n/{5}/{6}/{7}",
verb,
contentLength,
contentType,
(string)context.Variables["UTCNow"],
(string)context.Variables["version"],
account,
container,
fileName);
string signature = "";
var unicodeKey = Convert.FromBase64String(key);
using (var hmacSha256 = new HMACSHA256(unicodeKey))
{
var dataToHmac = Encoding.UTF8.GetBytes(stringToSign);
signature = Convert.ToBase64String(hmacSha256.ComputeHash(dataToHmac));
}
var authorizationHeader = string.Format(
"{0} {1}:{2}",
"SharedKey",
account,
signature);
return authorizationHeader;
}</value>
</set-header>
</inbound>
<backend>
<base />
</backend>
<outbound>
<base />
</outbound>
<on-error>
<base />
</on-error>
</policies>
我还没有试过,但听起来你可以获得请求正文(我假设你的文件就在那里):
var inBody = context.Request.Body.As<byte[]>(preserveContent: true);
基于此:https://docs.microsoft.com/en-us/azure/api-management/api-management-policy-expressions#ref-imessagebody and this https://docs.microsoft.com/en-us/azure/api-management/api-management-transformation-policies#SetBody
但是,如果您只想获得唯一的文件名,为什么不直接生成一个 GUID?或者你的意思是你想确保每个文件只上传一次? (然后散列可能有意义)
目前我们有前端将文件发送到 Azure 存储帐户到特定的 blob 容器中。前端通过一个人从存储帐户获取 SAS 并将其粘贴到前端代码中,从而手动将 SAS 令牌放入构建中,以便它可以读取和写入存储帐户。
我们想让前端向 APIM 发送一个带有文件的请求。然后我们想要对该文件进行哈希处理,使用该哈希作为名称并将其存储在 Azure Blob 存储中。我是 Azure API 管理的新手,这可能吗?上传的文件好像看不到了
在 APIM 策略中,我目前拥有对存储帐户的授权,但我不知道如何像通常在 MVC 应用程序中那样获得 Request.Files
。
我一直在寻找 https://docs.microsoft.com/ as well as https://techcommunity.microsoft.com/ 和 SO 我什至已经开始寻找 Google 搜索结果的第二页。我找不到任何表明这可能与否的信息。
这是我目前的政策。它的工作原理是前端可以点击它并通过一个文件并保存该文件。但是我们想对文件进行哈希处理并使用该哈希作为名称以避免 Azure 存储帐户 blob 容器中的名称冲突
<policies>
<inbound>
<base />
<set-variable name="UTCNow" value="@(DateTime.UtcNow.ToString("R"))" />
<set-variable name="Verb" value="@(context.Request.Method)" />
<set-variable name="documentstorage" value="{{documentstorage}}" />
<set-variable name="documentstoragekey" value="{{documentstorageaccesskey}}" />
<set-variable name="version" value="2019-12-12" />
<set-variable name="bodySize" value="@(context.Request.Headers["Content-Length"][0])" />
<set-variable name="contentType" value="@(context.Request.Headers["Content-Type"][0])" />
<set-header name="x-ms-version" exists-action="override">
<value>@((string)context.Variables["version"] )</value>
</set-header>
<set-header name="x-ms-blob-type" exists-action="override">
<value>BlockBlob</value>
</set-header>
<set-header name="date" exists-action="override">
<value>@((string)context.Variables["UTCNow"])</value>
</set-header>
<set-header name="Authorization" exists-action="override">
<value>@{
var account = (string)context.Variables["documentstorage"];
var key = (string)context.Variables["documentstoragekey"];
var verb = (string)context.Variables["Verb"];
var container = context.Request.MatchedParameters["container"];
var fileName = context.Request.MatchedParameters["fileName"];
var dateNow = (string)context.Variables["UTCNow"];
string contentType = (string)context.Variables["contentType"];//"application/pdf";
var contentLength = (string)context.Variables["bodySize"];
var stringToSign = string.Format("{0}\n\n\n{1}\n\n{2}\n{3}\n\n\n\n\n\nx-ms-blob-type:BlockBlob\nx-ms-version:{4}\n/{5}/{6}/{7}",
verb,
contentLength,
contentType,
(string)context.Variables["UTCNow"],
(string)context.Variables["version"],
account,
container,
fileName);
string signature = "";
var unicodeKey = Convert.FromBase64String(key);
using (var hmacSha256 = new HMACSHA256(unicodeKey))
{
var dataToHmac = Encoding.UTF8.GetBytes(stringToSign);
signature = Convert.ToBase64String(hmacSha256.ComputeHash(dataToHmac));
}
var authorizationHeader = string.Format(
"{0} {1}:{2}",
"SharedKey",
account,
signature);
return authorizationHeader;
}</value>
</set-header>
</inbound>
<backend>
<base />
</backend>
<outbound>
<base />
</outbound>
<on-error>
<base />
</on-error>
</policies>
我还没有试过,但听起来你可以获得请求正文(我假设你的文件就在那里):
var inBody = context.Request.Body.As<byte[]>(preserveContent: true);
基于此:https://docs.microsoft.com/en-us/azure/api-management/api-management-policy-expressions#ref-imessagebody and this https://docs.microsoft.com/en-us/azure/api-management/api-management-transformation-policies#SetBody
但是,如果您只想获得唯一的文件名,为什么不直接生成一个 GUID?或者你的意思是你想确保每个文件只上传一次? (然后散列可能有意义)