w przypadku ktoś jeszcze zmierzyć się z tym problemem Utworzyłem middle-ware który przechwycenia żądania i tworzyć kolejne ciało
public class FileStreamUploadMiddleware {
private readonly RequestDelegate _next;
public FileStreamUploadMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task Invoke(HttpContext context)
{
if (context.Request.ContentType != null)
{
if (context.Request.Headers.Any(x => x.Key == "Content-Disposition"))
{
ContentDispositionHeaderValue v = ContentDispositionHeaderValue.Parse(context.Request.Headers.First(x => x.Key == "Content-Disposition").Value);
if (HasFileContentDisposition(v))
{
var memoryStream = new MemoryStream();
context.Request.Body.CopyTo(memoryStream);
var length = memoryStream.Length;
var formCollection = context.Request.Form =
new FormCollection(new Dictionary<string, StringValues>(),
new FormFileCollection() { new FormFile(memoryStream, 0, length, v.Name, v.FileName) });
}
}
}
await _next.Invoke(context);
}
#region Helper
public static bool HasFileContentDisposition(ContentDispositionHeaderValue contentDisposition)
{
// this part of code from https://github.com/aspnet/Mvc/issues/7019#issuecomment-341626892
return contentDisposition != null
&& contentDisposition.DispositionType.Equals("form-data")
&& (!string.IsNullOrEmpty(contentDisposition.FileName)
|| !string.IsNullOrEmpty(contentDisposition.FileNameStar));
}
#endregion
}
iw sterowniku możemy pobierać pliki tworzenia żądania
[HttpPost("/api/file")]
public IActionResult GetFile([FromServices] IHttpContextAccessor contextAccessor, [FromServices] IHostingEnvironment environment)
{
//save the file
var files = Request.Form.Files;
foreach (var file in files)
{
var memoryStream = new MemoryStream();
file.CopyTo(memoryStream);
var fileStream = global::System.IO.File.Create($"{environment.WebRootPath}/images/background/{file.FileName}", (int)file.Length, FileOptions.None);
fileStream.Write(memoryStream.ToArray(), 0, (int)file.Length);
fileStream.Flush();
fileStream.Dispose();
memoryStream.Flush();
memoryStream.Dispose();
}
return Ok();
}
możesz ulepszyć kod do swoich potrzeb, np .: dodaj parametry formularza w treści żądania i przekształć go w deserializację.
jest to obejście, ale to działa.
Czy możesz opublikować ślad stosu wyjątków? –
@aguafrommars: Już rozwiązałem ten problem, sprawdź moją własną odpowiedź. – Transcendent