我的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();
}}
答案 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关于将大文件分成小块,在客户端上传它们,然后将它们合并回服务器端。