将MemoryStream文件存储到Azure Blob

时间:2020-12-11 16:57:50

I have an image that gets dynamically generated via System.Drawing. I am then outputting the generated image to a MemoryStream for storage into my Azure blob.

我有一个通过System.Drawing动态生成的图像。然后我将生成的图像输出到MemoryStream以存储到我的Azure blob中。

But I can't seem to get my file to store in the blob of my choice. There are no errors occurring and my image is successfully getting saved to MemoryStream. As expected, my blob is empty.

但我似乎无法将我的文件存储在我选择的blob中。没有错误发生,我的图像成功保存到MemoryStream。正如所料,我的blob是空的。

I have ensured my blob container has public read/write access.

我确保我的blob容器具有公共读/写访问权限。

Code

// Retrieve storage account from connection string.
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(String.Format("DefaultEndpointsProtocol=https;AccountName={0};AccountKey={1}", Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.GetConfigurationSettingValue("CMSAzureAccountName").ToString(), Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.GetConfigurationSettingValue("CMSAzureSharedKey").ToString()));

// Create the blob client.
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

// Retrieve reference to a previously created container.
CloudBlobContainer container = blobClient.GetContainerReference("myimagecontainer");

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

//Output image
ImageCodecInfo[] Info = System.Drawing.Imaging.ImageCodecInfo.GetImageEncoders();
EncoderParameters Params = new System.Drawing.Imaging.EncoderParameters(1);
Params.Param[0] = new EncoderParameter(Encoder.Quality, 100L);

System.IO.MemoryStream msImage = new System.IO.MemoryStream();
GenerateImage.Render(imageOutput).Save(msImage, Info[1], Params); //GenerateImage.Render() method creates a custom image and returns a Bitmap

// Create or overwrite the "myblob" blob with contents from a local file.
using (var fileStream = msImage)
{
    blockBlob.UploadFromStream(fileStream);
}

Any help would be appreciated.

任何帮助,将不胜感激。

Update

I managed to find what the main cause of the error. I needed to change the following:

我设法找到了错误的主要原因。我需要更改以下内容:

CloudStorageAccount storageAccount = CloudStorageAccount.Parse(String.Format("DefaultEndpointsProtocol=https;AccountName={0};AccountKey={1}", Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.GetConfigurationSettingValue("CMSAzureAccountName").ToString(), Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.GetConfigurationSettingValue("CMSAzureSharedKey").ToString()));

to

CloudStorageAccount storageAccount = CloudStorageAccount.Parse(RoleEnvironment.GetConfigurationSettingValue("DiagnosticsConnectionString"));

But I will mark "Gaurav Mantri" response as correct. If it wasn't for his insight, my image would not have uploaded to the blob.

但我会将“Gaurav Mantri”的回应标记为正确。如果不是他的见解,我的图像将不会上传到blob。

1 个解决方案

#1


27  

Try and set the Position of your memory stream to 0 and see if that helps. Something like the code below:

尝试将内存流的位置设置为0,看看是否有帮助。类似下面的代码:

msImage.Position = 0;//Move the pointer to the start of stream.

// Create or overwrite the "myblob" blob with contents from a local file.
using (var fileStream = msImage)
{
    blockBlob.UploadFromStream(fileStream);
}

#1


27  

Try and set the Position of your memory stream to 0 and see if that helps. Something like the code below:

尝试将内存流的位置设置为0,看看是否有帮助。类似下面的代码:

msImage.Position = 0;//Move the pointer to the start of stream.

// Create or overwrite the "myblob" blob with contents from a local file.
using (var fileStream = msImage)
{
    blockBlob.UploadFromStream(fileStream);
}