【问题标题】:Azure API Management rename fileAzure API 管理重命名文件
【发布时间】:2020-09-01 20:42:47
【问题描述】:

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

我们希望前端通过文件向 APIM 发送请求。然后,我们要对该文件进行哈希处理,使用该哈希作为名称并将其存储在 azure blob 存储中。我是 Azure API 管理的新手,这可能吗?好像看不到上传的文件。

在 APIM 策略中,我目前拥有对存储帐户的授权,但我不知道如何像通常在 MVC 应用中那样访问Request.Files

我一直在寻找 https://docs.microsoft.com/ 以及 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>

【问题讨论】:

    标签: azure file http azure-api-management cloud-storage


    【解决方案1】:

    我还没有尝试过,但听起来您可以获得请求正文(我假设您的文件所在的位置):

    var inBody = context.Request.Body.As&lt;byte[]&gt;(preserveContent: true);

    基于此:https://docs.microsoft.com/en-us/azure/api-management/api-management-policy-expressions#ref-imessagebody 和此https://docs.microsoft.com/en-us/azure/api-management/api-management-transformation-policies#SetBody

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

    【讨论】:

    • 谢谢@silent,我会试试的。正确,我们希望确保在这种特定情况下我们只存储一次文件。
    • 如果您希望 APIM 在读取请求内容后将其保留在内存中,请不要忘记添加额外的参数:context.Request.Body.As(preserveContent: true)跨度>
    • 我正在使用As&lt;JObject&gt; 并尝试通过那里访问内容。
    • @VitaliyKurokhtin,谢谢。我确实忘记了这样做,然后我的签名不起作用,因为开始内容长度与结束内容长度不匹配。
    猜你喜欢
    • 1970-01-01
    • 2020-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-14
    • 2021-12-29
    • 1970-01-01
    • 2015-10-02
    相关资源
    最近更新 更多