将 MemoryStream 文件存储到 Azure Blob

Posted

技术标签:

【中文标题】将 MemoryStream 文件存储到 Azure Blob【英文标题】:Storing MemoryStream File to Azure Blob 【发布时间】:2013-02-06 14:59:46 【问题描述】:

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

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

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

代码

// 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);

任何帮助将不胜感激。

更新

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

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()));

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

但我会将“Gaurav Mantri”回复标记为正确。如果不是他的洞察力,我的图片不会上传到 blob。

【问题讨论】:

【参考方案1】:

尝试将内存流的位置设置为 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);

【讨论】:

啊!我实际上收到了以下错误消息:“服务器无法验证请求。确保 Authorization 标头的值正确形成,包括签名。” 这通常意味着存储在配置文件中的帐户名/密钥存在问题。你能尝试做一个简单的操作,比如创建一个 blob 容器,看看你是否在那里得到错误。在上面的代码中创建 CloudBlobContainer 实例之后,您可以简单地执行 container.CreateIfNotExists()。 感谢您的帮助 Gaurav。我发现问题是由于 CloudStorageAccount 连接字符串造成的。但我已将您的回复标记为正确,因为它有助于解决上传文件问题。【参考方案2】:

我遇到了同样的问题,代码有效,但 pdf 文件大小始终为 0,我必须使 MyMemoryStream.Position = 0;下面是我使用的代码。希望它可以帮助某人。

using (pdfStream)

    pdfStream.Position = 0;
    blob.UploadFromStream(pdfStream);                            
    _model.ConvertedPdfUrl = blob.Uri.AbsoluteUri;

【讨论】:

以上是关于将 MemoryStream 文件存储到 Azure Blob的主要内容,如果未能解决你的问题,请参考以下文章

Image与byte[]数组的相互转换

PDFsharp 保存到 MemoryStream

将文件上传到 Blob 存储错误 get_NetworkTimeout 没有实现

无法写入新的 MemoryStream - 流已关闭

memorystream - 字符串流,字符串,其他?

在 asp.net web api 中使用 MemoryStream 和 ZipArchive 将 zip 文件返回给客户端