将签名上传到 Azure Blob 存储

Posted

技术标签:

【中文标题】将签名上传到 Azure Blob 存储【英文标题】:Uploading Signature to Azure Blob Storage 【发布时间】:2021-10-13 00:09:00 【问题描述】:

开始使用 Azure Blob 存储并从 Xamarin forms android 应用程序将图像上传到其中,图像从设备库中挑选并拍照并立即上传都没有问题。无论如何也要上传签名图像吗?我正在使用 Xamarin.Controls.SignaturePad.Forms 插件来创建签名,但我不明白如何以与图像相同的方式将其上传到 blob 存储。我需要以某种方式转换它吗?

签名码+上传码:

private async void SaveButton_Clicked(object sender, EventArgs e)
    
        Stream image = await PadView.GetImageStreamAsync(SignatureImageFormat.Jpeg);

    

private async void UploadImage(Stream stream)
        
            var account = CloudStorageAccount.Parse("Connection String + Key etc");
            var client = account.CreateCloudBlobClient();
            var container = client.GetContainerReference("images");
            await container.CreateIfNotExistsAsync();
            var name = Guid.NewGuid().ToString();
            var blockBlob = container.GetBlockBlobReference($"name.png");
            await blockBlob.UploadFromStreamAsync(stream);
            await DisplayAlert("Uploaded", "Image uploaded to Blob Storage Successfully!", "OK");
        

图片上传代码:

private async void btnTakePic_Clicked(object sender, EventArgs e)
        
            await CrossMedia.Current.Initialize();
            if (!CrossMedia.Current.IsCameraAvailable || !CrossMedia.Current.IsTakePhotoSupported)
            
                await DisplayAlert("No Camera", ":(No Camera available.)", "OK");
                return;
            
            else
            
                _mediaFile = await CrossMedia.Current.TakePhotoAsync(new StoreCameraMediaOptions
                
                    Directory = "Sample",
                    Name = "myImage.jpg"
                );

                if (_mediaFile == null) return;
                imageView.Source = ImageSource.FromStream(() => _mediaFile.GetStream());
                var mediaOption = new PickMediaOptions()
                
                    PhotoSize = PhotoSize.Medium
                ;
                UploadedUrl.Text = "Image URL:";
            
        

【问题讨论】:

从安全的角度来看,使用帐户密钥从 Android 应用程序直接上传到存储是一个非常糟糕的主意,我希望您在这里已经理解了这一点。您的应用程序的用户可以提取该密钥,然后对所有 blob、表等拥有完全的管理员级别访问权限。通常,您可以将文件上传到您的后端服务器,然后将其上传到存储。 我明白,现在只是在做一个概念证明,我们可以将各种内容上传到我们的 azure 存储区域,因为这是我们在此应用程序未上线之前没有做过的事情很快我们就会在想要上线时使用后端服务器。 SignaturePad 有一个返回位图的 GetImage() 方法。获得位图后,该过程应该相同,因为它们都是图像。您具体在坚持什么? 设法弄明白,对它的简单程度感到恼火。在 Save 按钮上调用 UploadImage 方法时,我只需在流中添加: UploadImage(image);让它识别我想要上传的内容。有趣的是,如果设置为 .png,它只会显示实际签名,如果设置为 .jpg,它只会显示黑色方块。 感谢@CB1216 的解决方法。将其发布为可能对其他社区成员有所帮助的答案。 【参考方案1】:

作为CB1216 的解决方案,

解决上传签名图片的问题,通过在saveButton的流中添加:UploadImage(image),以便方法识别需要上传的图片。

【讨论】:

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

尝试使用 SAS 访问 Azure blob 时收到“签名不匹配。使用的签名字符串是...”

浅谈Azure Storage的安全性

完成文件上传后,如何使用 nodejs 撤销 Azure 的共享访问签名(SAS)?

使用 SAS 将文件从 Azure Blob 存储下载到浏览器

将多个 Blob 上传到 Azure 存储

将 Blob 的上传大小限制到 Azure Blob 存储