c# - 编码 UI C# - 如何将捕获的图像上传到 Azure 存储容器

标签 c# azure azure-storage azure-blob-storage coded-ui-tests

从编码的 UI 测试方法中,将捕获的图像上传到 Azure 存储而不保存在本地驱动器中的方法是什么?

要将捕获的图像保存到本地文件中,我正在执行以下操作,效果很好:

BrowserWindow window = new BrowserWindow();
Image cml1 = window.CaptureImage();
cml1.Save(screenshotDir + screenshotDirClickMainLinks + "1" + 
CMLelectAndNaturalGas + DateTime.Now.ToString(dateTime) + fileSuffix); 

如何将“cml1”上传到 Azure 存储而不将其保存在本地驱动器中?我是否可以将 cml1 转换为可以输入到 Azure 存储对象的流?这个link看起来有一些信息,但它没有谈论 Azure 存储。这个link CloudBlockBlob 有“UploadFromStream”方法,但没有给出示例。

对于Azure存储,我知道how to create a container and upload a local file into that container 。这是代码段:

if (CloudStorageAccount.TryParse(storageConnectionString, out storageAccount))
{
    // Get the reference of the storage blob
    CloudBlobClient client = storageAccount.CreateCloudBlobClient();

    CloudBlobContainer container = client.GetContainerReference("testresult");

     container.CreateIfNotExists();

CloudBlockBlob cloudBlockBlob = container.GetBlockBlobReference(localFileName);
cloudBlockBlob.UploadFromFile(sourceFile);

// Uploading second file

CloudBlobContainer container2 = client.GetContainerReference("testresult");
            container2.CreateIfNotExists();


CloudBlockBlob cloudBlockBlob2 = container2.GetBlockBlobReference(localFileName2);
cloudBlockBlob2.UploadFromFile(sourceFile2);

}

如何使用“cml1”引用将捕获的图像直接上传到 Azure 存储而不先将其保存到本地文件夹中?

谢谢。

最佳答案

BrowserWindow.CaptureImage 返回的输出是 System.Drawing.Image (变量 cml1 的类型),您可以使用 described here 等技术将其转换为 byte[] ,或者更好,将图像压缩为更简洁的格式,例如 .PNG:

public static byte[] ImageToByte(Image img)
{
    using (var stream = new MemoryStream())
    {
        img.Save(stream, System.Drawing.Imaging.ImageFormat.Png);
        return stream.ToArray();
    }
}

信用:以上代码直接取自此 StackOverflow answer here

获得 byte[] 数组后,您可以直接将其上传到 Blobstorage 容器,方法与您尝试过的类似,但使用更直接CloudBlockBlob.UploadFromByteArrayAsync method .

public async Task SaveBlob(string containerName, string key, byte[] blobToSave)
{
  var blobClient = _storageAccount.CreateCloudBlobClient();
  var blobContainer = blobClient.GetContainerReference(containerName);
  await blobContainer.CreateIfNotExistsAsync();
  var blockBlob = container.GetBlockBlobReference(key);
  await blockBlob.UploadFromByteArrayAsync(blobToSave, 0, blobToSave.Length);
}

其中 _storageAccount 是从 Azure 存储帐户连接字符串解析的 CloudStorageAccountcontainerName 是容器(文件夹)的(小写)名称),key 是图像的唯一文件名,当然 blobToSave 是您刚刚转换的字节数组。

性能说明 - 如果您将多个 blob 存储到同一个容器引用,则您不会希望每次都执行 CreateIfNotExists(Async) 检查 - 理想情况下,执行一次性检查在启动应用程序或测试时的引导时间。

关于c# - 编码 UI C# - 如何将捕获的图像上传到 Azure 存储容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50378398/

相关文章:

Azure数据工厂数据流时区转换问题

rest - 如何连接到Azure表服务REST API?

c# - 使用 CSharpCodeProvider 引用项目时找不到元数据文件 'Domain.dll'

c# - 确定 Windows 7 通过 C# 设置的字体大小?

azure - 如何保护 Azure 中的目标目录免遭部署

azure - Cloud Explorer - 无法访问开发 Blob 容器

c# - Azure blob 存储 - 获取 block 列表以错误的顺序返回未提交的 block

azure - 跨区域更快的 Blob 存储复制工具

c# - 如何每次在每个测试方法(包含在同一测试装置中)之前初始化实例变量(在 nunit 的测试装置中声明)?

c# - .NET Entity Framework : Add-Migration is too slow