我需要将大文件分块发布到外部API。文件类型是我下载到本地系统的MP4,最大大小为4 gig。我需要对这些数据进行分块并将其发送出去。我看过的所有内容都处理来自Web前端的发布(Angular,JS等),并处理控制器上的分块数据。我需要取出保存在本地的文件并将其分块,然后将其发送给期望分块数据的现有API。
谢谢
答案 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; }
}
如果您想使用邮递员,请查看我如何传递参数:
如果要通过代码上传,则为伪代码:
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);
}
}
希望这会有所帮助