我正在尝试上传大型视频文件。我正在使用Azure存储Blob。阅读文档时,有关在https://docs.microsoft.com/en-us/aspnet/core/mvc/models/file-uploads?view=aspnetcore-2.1使用IFormFile的警告 这表明我正在流式传输数据。 以下代码是否在其中创建缓冲区会导致服务器崩溃或直接流式传输到存储设备?
从视图中
<form asp-action="Create" enctype="multipart/form-data">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<div class="form-group">
<label asp-for="Name" class="control-label"></label>
<input asp-for="Name" class="form-control" />
<span asp-validation-for="Name" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Description" class="control-label"></label>
<input asp-for="Description" class="form-control" />
<span asp-validation-for="Description" class="text-danger"></span>
</div>
<div class="form-group">
<input asp-for="VideoAsFile" class="form-control" />
<span asp-validation-for="VideoAsFile" class="text-danger"></span>
</div>
<div class="form-group">
<input type="submit" value="Create" class="btn btn-default" />
</div>
</form>
从控制器
public async Task<IActionResult> Create([Bind(" Name,Description,VideoAsFile")] VideoWithFileViewModel video)
{
if (ModelState.IsValid)
{
string imageId;
using (var stream = video.VideoAsFile.OpenReadStream())
{
imageId = videoServices.SaveVideo(stream);
}
var newVideo = new Video()
{
Name = video.Name,
Description = video.Description,
URL = imageId
};
repository.AddVideo(newVideo, User);
repository.SaveAll();
return RedirectToAction(nameof(Index));
}
从VideoServices
public string SaveVideo(Stream videoStream)
{
CloudBlobClient blobClient=new CloudBlobClient(new Uri(baseUri), credentials);
var imageId = Guid.NewGuid().ToString();
var container = blobClient.GetContainerReference("videos");
var blob = container.GetBlockBlobReference(imageId);
blob.UploadFromStreamAsync(videoStream);
return imageId;
}
答案 0 :(得分:1)
IFormFile
会导致问题,因为只有当请求主体完全后台处理到内存中时,模型绑定器才能执行其操作,如果上传量较大,则可能意味着要消耗大量GB的RAM或可能使内存最大化完全消耗您的RAM。
要缓冲上传,您必须直接使用请求流,这意味着在操作上完全关闭模型绑定。这意味着您无法从动作参数中获得任何内容。
请求主体流将被编码为multipart/form-data
,因此您必须手动将其解析为其组成部分,然后将数据直接绑定到您的实体/模型,然后在缓冲区中读取文件部分方式,将读取的块逐段传递到Azure blob存储。微软有一个example of doing a buffered upload。但是,它将上传文件写入磁盘。将其放入Azure blob存储中。