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

Coded UI C# - How to Upload Captured Image to Azure Storage Container

根据编码 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 looks to have some info, but it does not talk about Azure Storage. This link 有 CloudBlockBlob "UploadFromStream" 方法,但没有给出示例。

对于 Azure 存储,我知道 。这是代码段:

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 (the type of your variable cml1), which you can convert to a byte[] using a technique such as described here,或者更好的是,将图像压缩为更简洁的格式,例如 .PNG:

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

来源:以上代码直接取自 Whosebug 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) 检查 - 理想情况下,在 [=41] 处进行一次性检查=] 启动您的应用或测试的时间。