将图像文件上传到Azure blob C#的正确方法

时间:2018-02-08 05:42:17

标签: c# azure asp.net-web-api

在我的应用程序中,我们一次上传大量图像数据。通过Angular门户网站发出的请求和ASP.NET Web API正在接收请求,这些请求都托管在Azure服务器上。从API我直接将图像数据转换为字节并上传到Azure blob。 这是一种正确的上传方式吗?我是否需要首先将这些图像保存在我的服务器上(例如在某些路径上' C:/ ImagesToUpload')然后从那里上传到Azure blob? 我担心因为我们正在上传大量数据以及我现在正在使用的方式会产生内存问题,我对此并不了解。 所以,如果有人

2 个答案:

答案 0 :(得分:2)

我开发了同样的东西。我们对大量文件有相同的要求。我想你必须先在API端压缩文件,然后使用SAS令牌将其发送到blob文件中。但请确保在Azure Blob存储中,您必须传递小于5 MB的数据,因此我也找到了解决方案。 在这里,我有一些示例代码,经过一些测试后可以很好地工作。

 CloudStorageAccount storageAccount = CloudStorageAccount.Parse(SettingsProvider.Get("CloudStorageConnectionString", SettingType.AppSetting));
                var blobClient = storageAccount.CreateCloudBlobClient();
                var filesContainer = blobClient.GetContainerReference("your_containername");
                filesContainer.CreateIfNotExists();
                var durationHours = 24;
                //Generate SAS Token
                var sasConstraints = new SharedAccessBlobPolicy
                {
                    SharedAccessExpiryTime = DateTime.UtcNow.AddHours(durationHours),
                    Permissions = SharedAccessBlobPermissions.Write | SharedAccessBlobPermissions.Read
                };

                // Generate Random File Name using GUID
                var StorageFileName = Guid.NewGuid() + DateTime.Now.ToString();
                var blob = filesContainer.GetBlockBlobReference(StorageFileName);
                var blobs = new CloudBlockBlob(new Uri(string.Format("{0}/{1}{2}", filesContainer.Uri.AbsoluteUri, StorageFileName, blob.GetSharedAccessSignature(sasConstraints))));
                //Code for divide the file into the 4MB Chunk if its Greater than 4 MB then
                BlobRequestOptions blobRequestOptions = new BlobRequestOptions()
                {
                    SingleBlobUploadThresholdInBytes = 4 * 1024 * 1024, //1MB, the minimum
                    ParallelOperationThreadCount = 5,
                    ServerTimeout = TimeSpan.FromMinutes(30)
                };
                blob.StreamWriteSizeInBytes = 4 * 1024 * 1024;

                //Upload it on Azure Storage
                blobs.UploadFromByteArrayAsync(item.Document_Bytes, 0, item.Document_Bytes.Length - 1, AccessCondition.GenerateEmptyCondition(), blobRequestOptions, new OperationContext());

但是如果您拥有大量数据,请确保在调用此功能之前使用任何压缩技术。我用过" zlib"图书馆。您可以在http://www.componentace.com/zlib_.NET.htm上找到它的C#.NET它的免费软件。如果您想了解更多信息,请访问此https://www.zlib.net/

答案 1 :(得分:0)

根据我的理解,您还可以利用fineuploader直接将文件上传到Azure Blob存储,而无需先将文件发送到您的服务器。有关详细说明,您可以关注Uploading Directly to Azure Blob Storage

该脚本如下所示:

var uploader = new qq.azure.FineUploader({
    element: document.getElementById('fine-uploader'),
    request: {
        endpoint: 'https://<your-storage-account-name>.blob.core.windows.net/<container-name>'
    },
    signature: {
        endpoint: 'https://yourapp.com/uploadimage/signature'
    },
    uploadSuccess: {
        endpoint: 'https://yourapp.com/uploadimage/done'
    }
});

您可以关注Getting Started with Fine Uploader并安装fine-uploader软件包,然后按here初始化Azure Blob存储的FineUploader,然后按照here为Blob容器配置CORS并公开端点以创建SAS令牌。此外,以下是使用FineUploader的类似issue

  

从API我直接将图像数据转换为字节并上传到Azure blob。

     

我很担心,因为我们正在上传大量数据,而且我现在正在使用的方式,是否会造成内存问题

对于首先将文件上传到Web API端点的方法,然后上传到azure storage blob,我更希望使用MultipartFormDataStreamProvider将上传的文件存储到服务器中的临时文件中,而不是{{1哪个会使用内存。您可以按照此issue中相关代码段的详细信息进行操作。此外,您可以按照github sample使用Web API上传文件。