如何将字节数组(即 byte[])保存到 Azure Blob 存储?

Posted

技术标签:

【中文标题】如何将字节数组(即 byte[])保存到 Azure Blob 存储?【英文标题】:How do I save byte arrays i.e. byte[] to Azure Blob Storage? 【发布时间】: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

【问题讨论】:

【参考方案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 构造函数,则不会复制字节数组,因此我认为这种方法很有效。 我的测试(在***.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();
    

【讨论】:

以上是关于如何将字节数组(即 byte[])保存到 Azure Blob 存储?的主要内容,如果未能解决你的问题,请参考以下文章

delphi中string如何转换为byte.注意只是byte,不是byte数组!

如何将 int[] 转换为 byte[]

如何将base64位的字节数组转换成图片并显示

java中的byte有什么作用?

将 byte[] 转换为原始二维数组

java怎样把一个byte数组保存成图片到硬盘上?