【问题标题】:Azure mobile service and Azure storage integrationAzure 移动服务和 Azure 存储集成
【发布时间】:2023-04-09 07:33:01
【问题描述】:

我们使用带有 Javascript (Node.js) 后端的 Azure 移动服务。前端是 HTML/Javascript,作为 Azure Web App 运行。我们想使用 Azure Blob 存储来存储文件(从前端上传)。我搜索了一个实现此场景的工作示例,但我找不到它。有 .NET 后端或 Android/Windows Phone 前端的示例。作为一种解决方法,可以将文件发布到移动服务并从那里进行存储,但移动服务 api 主体有 1MB 的限制。我知道我必须使用共享访问签名 (SAS),但我不知道如何实现它。从移动服务生成网址有效。但是在客户端使用时不接受。

本指南不再有效:http://gauravmantri.com/2013/02/16/uploading-large-files-in-windows-azure-blob-storage-using-shared-access-signature-html-and-javascript/

提前感谢您的帮助!

【问题讨论】:

  • 如果您的前端在服务器端有代码,您可以轻松使用 azure storage SDK 生成 SAS 并与 Azure 存储github.com/Azure/azure-storage-node 对话(我假设您正在运行 nodejs)
  • 您好小敏,服务器端是带有 JavaScript (node.js) 的 Azure 移动服务。可以使用 Azure 存储 SDK 在那里生成 SAS,但是当我在前端使用这个 SAS(纯 JavaScript)时它不起作用。授权错误。
  • 如果您尝试直接从客户端 javascript 代码访问 azure stroage,您将遇到跨源问题。我相信您将需要配置您的存储帐户。 msdn.microsoft.com/en-us/library/azure/…
  • 是的 CORS 也是一个问题,但即使我将 chrome 与 --disable-web-security 一起使用,我也会遇到身份验证错误(授权标头签名)
  • 您是否配置了存储帐户?要启用 CORS,您的帐户中需要有 CORS 规则。请参考我上面发布的链接

标签: node.js azure azure-web-app-service azure-mobile-services azure-blob-storage


【解决方案1】:

通常,移动服务上的自定义 API 用于处理逻辑工作流或事件触发器。因此,Azure 移动服务会限制自定义 API 请求的主体大小,以获得更好的性能。若要将文件从客户端上传到 Azure 存储,我们建议使用 SAS URI。

并且很多示例使用后端项目生成 SAS URI 并返回到前端。我们可以利用移动服务自定义 API 脚本中的 Azure Node.js SDK 来生成 SAS URI。

这里是sn-p的代码:

exports.get = function(request, response) {
    var azure = require('azure');
    var qs = require('querystring');
    var accountName = { accountName };
    var accountKey = { accountKey };
    var host = accountName + '.blob.core.windows.net';
    var blobService = azure.createBlobService(accountName, accountKey, host);

    var startDate = new Date();
    var expiryDate = new Date(startDate);
    expiryDate.setMinutes(startDate.getMinutes() + 30);
    startDate.setMinutes(startDate.getMinutes() - 30);

    var sharedAccessPolicy = {
      AccessPolicy: {
        Permissions: azure.Constants.BlobConstants.SharedAccessPermissions.WRITE,
        Start: startDate,
        Expiry: expiryDate
      },
    };
    // you can custom send container name and blob name via http get request
    /** e.g. var containerName = request.query.container, 
                 blobName = request.query.blob

        client side use invokeApi method, e.g.
        client.invokeApi('getSAS',{
            method:'GET',
            parameters:{container:'mycontainer',blob:'myblob'}
        })
    **/
    var blobSAS = blobService.generateSharedAccessSignature('mycontainer', 'myblob', sharedAccessPolicy);
    var sasQueryString = qs.stringify(blobSAS.queryString);
    var sasUri = blobSAS.baseUrl + blobSAS.path;
    response.send(sasUri+"?"+sasQueryString);
}; 

您可以参考Upload images to Azure Storage from an Android deviceWork with a JavaScript backend mobile service

另外,关于生成SAS URI的深入理解,可以参考Constructing a Service SASShared Access Signatures, Part 1: Understanding the SAS Model

另外,这里有一个类似的例子,在这个架构中构建,Upload files to Microsoft Azure Storage from JavaScript

【讨论】:

  • 嗨,加里,感谢您的回复!我没有时间检查这个。我会尽快完成并回复您。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-25
  • 2017-09-28
  • 1970-01-01
  • 2014-01-13
相关资源
最近更新 更多