【问题标题】:Upload BlockBlob to Azure Storage using React使用 React 将 BlockBlob 上传到 Azure 存储
【发布时间】:2019-06-21 02:34:35
【问题描述】:

我无法找到一个可行的示例。 下面的例子告诉我 createBlockBlob 方法是未定义的。

注意:我也尝试过 createBlockBlobFromLocalFile 并传入文件名,但仍然没有成功。

import React from 'react';
var storage = require('azure-storage');

const CONNECTION_STRING = "MYCONNECTIONSTRING";
const BlockBlobContainerName = "MYCONTAINERNAME";
const BlobName = "MYBLOBNAME";

class NumberUploader extends React.Component {

   render() {
      return (
         <div className="App">
         <input type="file" onChange={ (e) => this.buttonClick(e.target.files[0]) } />
         </div>
      );
   }

   buttonClick(myFile) {
      var blobService = storage.createBlobService(CONNECTION_STRING);
      blobService.createContainerIfNotExists(BlockBlobContainerName, function (error) {
         if (error) {
            console.log("error creating container");
         }
      });
      blobService.createBlockBlobFromBrowserFile(BlockBlobContainerName, BlobName, myFile, function (error, result, response) {
         if (error) {
            alert('Upload failed, open browser console for more detailed info.');
            console.log(error);
         } else {
            setTimeout(function () { // Prevent alert from stopping UI progress update
               alert('Upload successfully!');
            }, 1000);
         }
      });
   }
};
export default NumberUploader;

编辑: Visual Studio 提供了一个非常好的运行 .Net Core 服务 React 的 Web 应用程序模板。我能够在服务器上使用以下代码来获取 SASToken 并将其传递给 React。从那里,您可以对 SAS 使用浏览器文件上传方法。

    static string GetAccountSASToken()
    {
        // To create the account SAS, you need to use your shared key credentials. Modify for your account.
        const string ConnectionString = "GET_STRING_FROM_STORAGE_ACCOUNT";
        CloudStorageAccount storageAccount = CloudStorageAccount.Parse(ConnectionString);

        // Create a new access policy for the account.
        SharedAccessAccountPolicy policy = new SharedAccessAccountPolicy()
        {
            Permissions = SharedAccessAccountPermissions.Read | SharedAccessAccountPermissions.Write | SharedAccessAccountPermissions.List,
            Services = SharedAccessAccountServices.Blob | SharedAccessAccountServices.File,
            ResourceTypes = SharedAccessAccountResourceTypes.Service,
            SharedAccessExpiryTime = DateTime.UtcNow.AddHours(24),
            Protocols = SharedAccessProtocol.HttpsOnly
        };

        // Return the SAS token.
        string token = storageAccount.GetSharedAccessSignature(policy);
        return token;
    }

【问题讨论】:

  • 即使当您调用createBlockBlobFromBrowserFile 时,您是否收到与createBlockBlob 方法未定义相同的错误消息?您使用的azure-storage SDK 的版本是什么?另外,我假设您使用的是 SAS 令牌。
  • @GauravMantri 抱歉。在这个问题上敲了 8 个小时后,我有点懒惰了。我找不到 createBlockBlobFromBrowserFile。我没有使用 SAS 令牌。我正在使用 connectionString 并使用通配符设置 CORS 规则,以便我可以使用 localhost 上传。 azure-storage@2.10.3

标签: reactjs azure azure-storage azure-blob-storage


【解决方案1】:

以下是 storage JS v2 和 V10 SDK 在浏览器场景支持方面的一些区别:

  1. V10 支持带有npm 包经典单JS 包文件 的浏览器场景; V2 仅支持与彼得潘的示例一样的经典单个 JS 捆绑文件的浏览器使用。

  2. V10 不支持浏览器中的 SharedKeyCredential,而 V2 支持。

所以,如果你正在构建一个 React Web APP 并使用 npm 依赖项导入存储 SDK。请使用 V10。另外请不要在浏览器中使用帐户名和密钥,因为这不安全。

【讨论】:

    【解决方案2】:

    我看到您使用 Azure Storage SDK v2 用于 JavaScript 将 React 中的文件从浏览器上传到 Azure Blob 存储。有一个类似的 SO 线程 How to upload folder into azure automatically? 我已经用 JavaScript 中的完整代码回答了它。我认为它可以帮助您编写 React 代码并使其在浏览器中运行。

    根据您的描述和代码,我在使用 Azure Storage JS SDK v2 时给您一些建议。

    1. 根据我的经验,有一些与 Node.js 和浏览器不兼容的地方。所以不能在浏览器中使用createBlockBlobFromLocalFile方法上传文件。
    2. 请参考文档Azure Storage JavaScript Client Library Sample for Blob Operations在您的HTML文件中导入azure-storage.blob.js进行如下blob操作。

      <script src="azure-storage.blob.js"></script>
      

      或在线版本。

      <script src="https://dmrelease.blob.core.windows.net/azurestoragejssample/bundle/azure-storage.blob.js"></script>
      
    3. 然后,你就可以在浏览器中使用createBlockBlobFromBrowserFile方法了。

    同时,Azure Storage JS SDK 的新版本是v10,它似乎提高了兼容性,您可以关注它的 API标记为“仅在 NODE.JS 运行时可用”或“仅适用于 BROWSERS" 了解 Node.js 和浏览器运行时之间的差异。

    希望对你有帮助。

    .

    【讨论】:

    • 我从头开始重新尝试确保使用@azure/storage-blob@10.3.0。遵循文档“github.com/azure/azure-storage-js/tree/master/blob/samples”中的简单示例,但现在我正在点击 SharedKeyCredential is not a Constructor “stackoverflow.com/questions/56520576/…
    • @FrankSposaro 好的,我会尽力帮助您重新启动代码。同时,我使用 v2 SDK 的代码工作正常,我测试。我希望你也可以用 React 尝试一下,并将我的帖子标记为答案。谢谢!
    • 好的。我会回去再试一次V2。我想我不了解node.js vs react vs browsers的基础知识。如果您的代码在服务器端运行,那如何允许从客户端上传文件?
    • @FrankSposaro 请仔细阅读我在 SO 线程 stackoverflow.com/questions/55613356/… 中的代码。
    • @FrankSposaro 出于安全考虑,我不建议将存储的帐户密钥放在前端代码中。因此,您需要从后端生成带有 SAS 令牌的 blob url,并将其传递给前端代码,以便将文件上传到安全 blob url。即使您切换到使用 v10 SDK,也不要在前端公开您的密钥。
    猜你喜欢
    • 2020-02-23
    • 2018-05-06
    • 2022-01-26
    • 2023-03-28
    • 2019-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-09
    相关资源
    最近更新 更多