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

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

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); } } 

ReadFullyfunction

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

由于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方法,您可以遵循此类似问题 。 此外,我更喜欢将Azure存储客户端库与Azurefunction一起使用,您可以使用.NET开始使用Azure Blob存储入门 。

更新:

此外,您可以按照本教程关于将大文件分成小块,在客户端上传它们,然后将它们合并回服务器端。