rest - 在外部系统+ REST API中显示来自Azure的文件服务的图像

标签 rest azure

我使用 azure 的 GETFILE() 服务创建了一个方法。引用:https://learn.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 检索到的相应图像。我怎样才能实现这一目标?

最佳答案

在回答你的问题之前先说几件事:

  • 文件存储并不真正适合您想要完成的任务(尽管这是可能的)。
  • 您应该考虑使用 Blob 存储,因为 Blob 存储更适合这种场景。

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

  • 如果 Blob 容器(相当于文件存储中的共享)的 ACL 为 BlobContainer(即容器中的 Blob 是公开可用的),您可以只需在响应中返回 blob 的 URL(与上面代码中的请求 URL 相同),然后在应用程序中创建一个链接,并将 href 设置为该 URL。
  • 如果 Blob 容器的 ACL 为私有(private)(即 Blob 不公开),您需要在该容器上创建一个共享访问签名 (SAS) token blob 至少具有读取 权限,然后创建 SAS URL。 SAS URL 就是blob URL + SAS token ,并在您的响应中返回此 SAS URL,然后在您的应用程序中创建一个链接,并将 href 设置为该 URL。

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

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

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

关于rest - 在外部系统+ REST API中显示来自Azure的文件服务的图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46216172/

相关文章:

http - 从grails中的POST请求中读取Word文件

android - Robospice : CachedSpiceReques. 未找到 getSpiceRequest

rest - 为长期任务创建 REST API 的最佳方式?

service - Azure 服务总线 - 订阅者数量

azure - 我被收取地理复制 v2 数据传输费用,但原因未知

azure - 在 Microsoft Azure Web App 部署期间运行 SSH 脚本

python - 如何使用 Python 进行基本的 REST Post 请求?

http - REST:HTTP header 或请求参数

azure - 接收 MS CRM Dynamics 的 WebHook

java - 使用图形 API 的 Azure AD 导入适用于随机应用程序