【问题标题】:I know about uploading in chunks, do we have to do something on receiving end?我知道分块上传,我们必须在接收端做些什么吗?
【发布时间】:2018-07-11 10:07:39
【问题描述】:

我的 azure 函数接收大型视频文件和图像并将其存储在 Azure blob 中。客户端 API 将数据分块发送到我的 Azure htttp 触发器函数。我是否必须在接收端做一些事情来提高性能,比如分块接收数据?

Bruce,实际上客户端代码正在由其他团队开发。现在我正在通过邮递员对其进行测试并从多部分 http 请求中获取文件。

foreach (HttpContent ctnt in provider.Contents)  {

                var dataStream = await ctnt.ReadAsStreamAsync();
 if (ctnt.Headers.ContentDisposition.Name.Trim().Replace("\"", "") == "file")
               {                
                        byte[] ImageBytes = ReadFully(dataStream);
                        var fileName = WebUtility.UrlDecode(ctnt.Headers.ContentDisposition.FileName);                         

              } }

ReadFully 函数

 public static byte[] ReadFully(Stream input){
using (MemoryStream ms = new MemoryStream())
{
    input.CopyTo(ms);
    return ms.ToArray();
}}

【问题讨论】:

  • 您能否共享客户端代码 sn-p 用于分块上传数据,以及用于将文件上传到 blob 存储的 azure 函数中的当前代码?我假设你可以做一些额外的设置,并在你的 azure 函数中将文件并行上传到你的 blob 存储以提高性能。

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


【解决方案1】:

正如BlobRequestOptions.ParallelOperationThread 所述:

获取或设置可以同时上传的块数。

备注:

在 blob 上使用 UploadFrom* 方法时,该 blob 将被分解为块。设置这个 值限制了库正在进行的未完成 I/O“放置块”请求的数量 在给定的时间。默认值为 1(无并行性)。将此值设置得更高可能会导致 更快的 Blob 上传,具体取决于客户端和 Azure 存储服务之间的网络。 如果 blob 很小(小于 256 MB),建议将此值保持为 1。

我假设您可以显式设置 ParallelOperationThreadCount 以加快 Blob 上传速度。

var requestOption = new BlobRequestOptions()
{
    ParallelOperationThreadCount = 5 //Gets or sets the number of blocks that may be simultaneously uploaded.
};

//upload a blob from the local file system
await blockBlob.UploadFromFileAsync("{your-file-path}",null,requestOption,null);

//upload a blob from the stream
await blockBlob.UploadFromStreamAsync({stream-for-upload},null,requestOption,null);

foreach(provider.Contents 中的 HttpContent ctnt)

根据您的代码,我假设您检索 provider 实例如下:

MultipartMemoryStreamProvider provider = await request.Content.ReadAsMultipartAsync();

此时,您可以使用以下代码上传新的 blob:

var blobname = ctnt.Headers.ContentDisposition.FileName.Trim('"');
CloudBlockBlob blockBlob = container.GetBlockBlobReference(blobname);
//set the content-type for the current blob
blockBlob.Properties.ContentType = ctnt.Headers.ContentType.MediaType;
await blockBlob.UploadFromStreamAsync(await ctnt.Content.ReadAsStreamAsync(), null,requestOption,null);

我更喜欢使用MultipartFormDataStreamProvider,它将从客户端上传的文件存储到文件系统而不是MultipartMemoryStreamProvider,后者将使用服务器内存来临时存储从客户端发送的数据。对于 MultipartFormDataStreamProvider 方法,您可以遵循类似的issue。此外,我更喜欢将 Azure 存储客户端库与我的 Azure 功能一起使用,您可以关注 Get started with Azure Blob storage using .NET

更新:

此外,您可以按照tutorial 将大文件分成小块,将它们上传到客户端,然后将它们合并回您的服务器端。

【讨论】:

  • 感谢布鲁斯。客户端是否有任何内容以块的形式上传,而我的函数以块的形式接收,合并并将其保存为 blob 中的文件?
  • 我之前可能误解了你的问题。为了让客户端 API 以块的形式发送数据,我假设您需要让服务器端支持此功能。这是一个讨论类似场景的教程,您可以关注here 了解实现。此外,您仍然可以按照有关加快将文件上传到服务器端 Blob 存储的部分进行操作。
  • 您分享的示例是在客户端 API 中以块的形式上传数据......其他团队会这样做。在我从请求对象接收数据的函数中,我是否必须分块接收并合并这些块?
  • 据我了解,在客户端分块上传数据的方式取决于您的服务器端代码实现。您的客户端需要使用服务器端公开的 API 来上传文件。我认为您需要与处理客户端代码的团队成员进行沟通。
猜你喜欢
  • 1970-01-01
  • 2021-12-12
  • 1970-01-01
  • 1970-01-01
  • 2022-11-04
  • 1970-01-01
  • 2012-03-31
  • 2012-08-15
  • 2021-06-08
相关资源
最近更新 更多