如何将字节数组(即 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 存储?的主要内容,如果未能解决你的问题,请参考以下文章