【问题标题】:Displaying Images of File Service from Azure in external system + REST API在外部系统 + REST API 中显示来自 Azure 的文件服务的图像
【发布时间】:2017-09-14 10:03:44
【问题描述】:

我创建了一个使用 Azure 的 GETFILE() 服务的方法。参考:https://docs.microsoft.com/en-us/rest/api/storageservices/get-file

  public void getImage(){
        string storageKey = 'xxxxStorageKeyxxx';
        string storageName = '<storageName>';
        Datetime dt = Datetime.now();
        string formattedDate = dt.formatGMT('EEE, dd MMM yyyy HH:mm:ss')+ ' GMT';
        string CanonicalizedHeaders = 'x-ms-date:'+formattedDate+'\nx-ms-version:2016-05-31';
        string CanonicalizedResource = '/' + storageName + '/<shareName>/<dirName>/<File Name>\ntimeout:20';
        string StringToSign = 'GET\n\n\n\n\napplication/octet-stream\n\n\n\n\n\n\n' + CanonicalizedHeaders+'\n'+CanonicalizedResource;

        Blob temp = EncodingUtil.base64Decode(storageKey);
        Blob hmac = Crypto.generateMac('HmacSHA256',Blob.valueOf(StringToSign),temp ); //StringToSign
        system.debug('oo-'+EncodingUtil.base64Encode(hmac));
        HttpRequest req = new HttpRequest();
        req.setMethod('GET');
        req.setHeader('x-ms-version','2016-05-31' );
        req.setHeader('x-ms-date', formattedDate);
        req.setHeader('content-type','application/octet-stream');
        string signature = EncodingUtil.base64Encode(hmac);
        string authHeader =  'SharedKey <storageName>'+':'+signature;

        req.setHeader('Authorization',authHeader);
        req.setEndpoint('https://<storageName>.file.core.windows.net/<shareName>/<dirName>/<file Name>?timeout=20');

        Http http = new Http();
        HTTPResponse res;
        res = http.send(req);                
    }

以上工作正常,并将 200 作为响应代码。但是,我的主要目标是显示/下载我通过 REST API 检索到的相应图像。我怎样才能做到这一点?

【问题讨论】:

    标签: rest azure


    【解决方案1】:

    在我回答你的问题之前有几件事:

    • 文件存储并不真正适合您想要完成的任务(尽管有可能)。
    • 您应该为此查看 Blob 存储,因为 Blob 存储更适合这种情况。

    假设您使用 Blob 存储,您可以执行以下操作:

    • 如果 blob 容器(相当于文件存储中的共享)的 ACL 为 BlobContainer(即容器中的 blob 是公开可用的),您可以简单地返回 blob 的 URL(您的请求也是如此)上面代码中的 URL)在您的响应中,然后在您的应用程序中创建一个链接,并将 href 设置为此 URL。
    • 如果 blob 容器的 ACL 为 Private(即 blob 不公开可用),则需要在该 blob 上创建一个 Shared Access Signature (SAS) 令牌,至少具有 Read 权限,然后创建一个 SAS URL。 SAS URL 只是 blob URL + SAS token 并在您的响应中返回此 SAS URL,然后在您的应用程序中创建一个链接,并将 href 设置为此 URL。

    由于 Azure 文件共享始终是私有的,如果您要使用 Azure 文件服务来提供文件,您将执行与上面列出的第二个选项相同的操作。您将在文件上创建一个至少具有Read 权限的 SAS 令牌,然后在响应中返回 SAS URL,然后在您的应用程序中创建一个链接,并将 href 设置为此 URL。

    要了解共享访问签名,您可能会发现此链接很有帮助:https://docs.microsoft.com/en-us/azure/storage/common/storage-dotnet-shared-access-signature-part-1

    要使用 REST API 创建共享访问签名,您可能会发现此链接很有帮助:https://docs.microsoft.com/en-us/rest/api/storageservices/Constructing-a-Service-SAS?redirectedfrom=MSDN

    【讨论】:

    • 感谢您提供的信息。我只能选择使用文件服务。我将尝试使用 SAS 令牌。
    猜你喜欢
    • 2016-07-10
    • 1970-01-01
    • 2015-10-10
    • 1970-01-01
    • 1970-01-01
    • 2011-05-18
    • 1970-01-01
    • 2020-11-25
    • 1970-01-01
    相关资源
    最近更新 更多