Azure API管理重命名文件



目前,我们有前端将文件发送到Azure存储帐户的特定blob容器中。前端是通过一个人从存储帐户中获取SAS并将其粘贴到前端代码中,从而可以读取和写入存储帐户,从而手动将SAS令牌放入构建中。

我们想让前端向APIM发送一个带有文件的请求。然后,我们想对该文件进行散列,使用该散列作为名称,并将其存储在azure blob存储中。我是Azure API管理的新手,这可能吗?我好像看不到上传的文件。

在APIM策略中,我目前可以使用存储帐户的授权,但我不知道如何像在MVC应用程序中那样访问Request.Files

我一直在到处找https://learn.microsoft.com/以及https://techcommunity.microsoft.com/所以我甚至开始在谷歌搜索结果的第二页上搜索。我找不到任何东西表明这是可能的还是不可能的。

这是我目前的政策。它的工作原理是,前端可以点击它并通过一个文件,然后保存该文件。但我们希望对文件进行散列,并将该散列用作名称,以避免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}nnn{1}nn{2}n{3}nnnnnnx-ms-blob-type:BlockBlobnx-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://learn.microsoft.com/en-us/azure/api-management/api-management-policy-expressions#ref-imessagebody和这个https://learn.microsoft.com/en-us/azure/api-management/api-management-transformation-policies#SetBody

但是,如果您只想获得一个唯一的文件名,为什么不简单地生成一个GUID呢?或者你是说你想确保每个文件只上传一次?(那么散列可能有意义(

最新更新