在外部系统+ REST API中显示Azure中的文件服务映像

时间:2017-09-14 10:03:44

标签: rest azure

我使用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检索的相应图像。我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:1)

在回答你的问题之前,我要做一些事情:

  • 文件存储并不适合您尝试完成的任务(尽管如此)。
  • 您应该查看Blob存储,因为blob存储更适合这种情况。

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

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

由于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