【问题标题】:How do I save byte arrays i.e. byte[] to Azure Blob Storage?如何将字节数组(即 byte[])保存到 Azure Blob 存储?
【发布时间】:2013-02-13 10:39:49
【问题描述】:

我知道如何保存 Streams,但我想获取该流并创建缩略图和其他大小的图像,但我不知道如何将 byte[] 保存到 Azure Blob Storage。

这就是我现在正在做的保存 Stream:

 // Retrieve reference to a blob named "myblob".
        CloudBlockBlob _blockBlob = container.GetBlockBlobReference("SampleImage.jpg");

        // upload from Stream object during file upload
        blockBlob.UploadFromStream(stream);

        // But what about pushing a byte[] array?  I want to thumbnail and do some image manipulation

【问题讨论】:

    标签: c# azure azure-blob-storage


    【解决方案1】:

    这曾经在 Storage Client 库中(肯定是 1.7 版) - 但他们在 2.0 版中删除了它

    “现在所有的上传和下载方法都是基于流的,FromFile, ByteArray、Text 重载已被移除。”

    http://blogs.msdn.com/b/windowsazurestorage/archive/2012/10/29/windows-azure-storage-client-library-2-0-breaking-changes-amp-migration-guide.aspx

    在字节数组周围创建一个只读内存流是相当轻量级的:

    byte[] data = new byte[] { 1, 2, 3 };
    using(var stream = new MemoryStream(data, writable: false)) {
        blockBlob.UploadFromStream(stream);
    }
    

    更新:UploadFromByteArray 回来了

    MSDN documentation - 从我在the source code 中可以看出,这在 3.0 版中又回来了,在 4.0 版中仍然存在。

    【讨论】:

    • 啊,所以一个明确的不,它不再可用。明白了。谢谢。
    • 我们可以在 PowerShell 中实现同样的效果吗?尤其是在 ARM 模板中运行的内联 deployment script 的上下文中?
    【解决方案2】:

    更新:

    UploadFromByteArray 回来了。

    public void UploadFromByteArray (
        byte[] buffer,
        int index,
        int count,
        [OptionalAttribute] AccessCondition accessCondition,
        [OptionalAttribute] BlobRequestOptions options,
        [OptionalAttribute] OperationContext operationContext
    )
    

    http://msdn.microsoft.com/en-us/library/microsoft.windowsazure.storage.blob.cloudblockblob.uploadfrombytearray.aspx

    【讨论】:

      【解决方案3】:

      使用新的 SDK azure.storage.blob

      var blobContainerClient = new BlobContainerClient(storageConnectionString, containerName);
      BlobClient blob = blobContainerClient.GetBlobClient(blobName);
      
      using(var ms = new MemoryStream(data, false))
      {
           await blob.UploadAsync(ms);
      }
      

      【讨论】:

      • 感谢新方法,对 blobName 进行一个小查询.. 是不是我们可以在这里用作 blobname 的文件名
      • 是的,blobname 是文件名!
      • @EnigmaState 您可以将整个路径与目录一起使用,当您使用 Azure 存储资源管理器时,它会在目录中进行转换以获得更好的可视化效果。示例:文件夹 1/文件夹 2/文件名.txt
      【解决方案4】:

      我对 Azure 也一无所知,但使用 Streams,您可以按如下方式处理它:

      //byte[] data;
      
      using(var ms = new MemoryStream(data, false))
      {
          blockBlob.UploadFromStream(ms);
      }
      

      【讨论】:

      • 所以只能上传流,所以每次都要转换?有没有办法只推送一个字节数组?
      • 我对 Azure 一无所知。对不起。
      • @Shane,我认为如果您按照我上面的编辑使用 MemoryStream 构造函数,则不会复制字节数组,因此我认为这种方法很有效。
      • 我的测试(在stackoverflow.com/questions/8624071/… 中有详细说明)强烈表明它确实重用了该字节数组。
      【解决方案5】:

      这是我目前使用的功能:

      //CREATE FILE FROM BYTE ARRAY
      public static string createFileFromBytes(string containerName, string filePath, byte[] byteArray)
      {
      
          try {
      
              CloudStorageAccount storageAccount = CloudStorageAccount.Parse(ConfigurationManager.ConnectionStrings("StorageConnectionString").ConnectionString);
      
      
      
              CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
              CloudBlobContainer container = blobClient.GetContainerReference(containerName);
      
              if (container.Exists == true) {
                  CloudBlockBlob blockBlob = container.GetBlockBlobReference(filePath);
      
      
                  try {
                      using (memoryStream == new System.IO.MemoryStream(byteArray)) {
                          blockBlob.UploadFromStream(memoryStream);
                      }
                      return "";
                  } catch (Exception ex) {
                      return ex.Message.ToString();
                  }
              } else {
                  return "Container does not exist";
              }
          } catch (Exception ex) {
              return ex.Message.ToString();
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2017-11-29
        • 2021-03-19
        • 1970-01-01
        • 2020-08-25
        • 2011-09-24
        • 2021-09-20
        • 1970-01-01
        • 2020-05-27
        • 2018-01-11
        相关资源
        最近更新 更多