我知道有关上传的内容,我们是否必须在接收端做一些事情?

时间:2018-02-01 06:35:13

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

我的azure函数接收大型视频文件和图像,并将其存储在Azure blob中。客户端API正在以块的形式将数据发送到我的Azure htttp触发器功能。我是否必须在接收端执行某些操作以提高性能,例如以块的形式接收数据?

布鲁斯,实际上客户代码是由其他团队开发的。现在我正在邮递员测试它并从多部分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();
}}

1 个答案:

答案 0 :(得分:1)

BlobRequestOptions.ParallelOperationThread所述:

  

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

     

<强>说明:

     

在blob上使用UploadFrom *方法时,blob将被分解为块。设置这个   value限制了未完成的I / O&#34;放置块&#34;请求图书馆将在飞行中   在给定的时间。默认值为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关于将大文件分成小块,在客户端上传它们,然后将它们合并回服务器端。