【问题标题】:Buffer too many uploads?缓冲太多上传?
【发布时间】:2019-08-16 02:00:27
【问题描述】:

我正在尝试上传大型视频文件。我正在使用 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;
        }

【问题讨论】:

    标签: asp.net-mvc asp.net-core azure-storage


    【解决方案1】:

    IFormFile 会导致问题,因为模型绑定器只能在请求正文完全假脱机到内存中后才能执行其操作,如果您有大量上传,这可能意味着用尽数 GB 的 RAM 或可能会耗尽您的 RAM完全利用。

    要缓冲上传,您必须直接使用请求流,这意味着在操作上完全关闭模型绑定。这意味着您无法从操作参数中获得任何东西

    请求体流将被编码为multipart/form-data,因此您必须手动将其解析为其组成部分,并将数据直接绑定到您的实体/模型,然后以缓冲的方式读取文件部分,将您读取的块逐个传递到 Azure blob 存储。微软有一个example of doing a buffered upload。但是,它将上传文件写入磁盘。将其放入 Azure blob 存储是您的事。

    【讨论】:

      猜你喜欢
      • 2013-05-13
      • 1970-01-01
      • 2012-03-21
      • 1970-01-01
      • 2016-09-22
      • 1970-01-01
      • 1970-01-01
      • 2012-11-19
      • 2010-12-03
      相关资源
      最近更新 更多