将大文件发布到REST Endpoint C#.net Core

时间:2019-07-30 15:11:52

标签: c# .net-core

我需要将大文件分块发布到外部API。文件类型是我下载到本地系统的MP4,最大大小为4 gig。我需要对这些数据进行分块并将其发送出去。我看过的所有内容都处理来自Web前端的发布(Angular,JS等),并处理控制器上的分块数据。我需要取出保存在本地的文件并将其分块,然后将其发送给期望分块数据的现有API。

谢谢

1 个答案:

答案 0 :(得分:1)

我认为这2个链接可以帮助您实现所需的功能,通常IFormFile对大文件有限制,在这种情况下,您需要对其进行流处理。

This is from MVC 2 and will help you to understand the HttpPostedFileBase approach

Same approach but wrapping it into a class

Asp.net core 2.2在文档中具有正确的示例,以防您要上传较大的文件:See this section

背后的想法是流式传输内容,为此,您需要禁用Asp.net核心具有的绑定,并开始流式传输发布/上传的内容。 收到该信息后,您可以使用FormValueProvider重新绑定从客户端收到的所有键/值。 因为您使用的是多部分内容类型,所以需要注意所有内容的顺序不会相同,也许您会收到文件,以后会收到其他参数,反之亦然。

    [HttpPost(Name = "CreateDocumentForApplication")]
    [DisableFormValueModelBinding]
    public async Task<IActionResult> CreateDocumentForApplication(Guid tenantId, Guid applicationId, DocumentForCreationDto docForCreationDto, [FromHeader(Name = "Accept")] string mediaType)
    {
         //use here the code of the asp.net core documentation on the Upload method to read the file and save it, also get your model correctly after the binding
    }

您会注意到,我在帖子中传递了更多参数,例如DocumentForCreationDto,但是方法是相同的(禁用绑定)

 public class DocumentForCreationDto : IDto
    {
        //public string CreatedBy { get; set; }
        public string DocumentName { get; set; }
        public string MimeType { get; set; }
        public ICollection<DocumentTagInfoForCreationDto> Tags { get; set; }
    }

如果您想使用邮递员,请查看我如何传递参数:

enter image description here

如果要通过代码上传,则为伪代码:

    void Upload()
    {
        var content = new MultipartFormDataContent();
        // Add the file
        var fileContent = new ByteArrayContent(file);
        fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data")
            {
                FileName = fileName,
                FileNameStar = "file"
            };
content.Add(fileContent);
            //this is the way to add more content to the post
            content.Add(new StringContent(documentUploadDto.DocumentName), "DocumentName");
            var url = "myapi.com/api/documents";
            HttpResponseMessage response = null;
            try
            {
                response = await _httpClient.PostAsync(url, content);
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
            }
    }

希望这会有所帮助