ASP.NET 최소 API를 사용하여 파일 업로드
내가 한 첫 번째 작업 중 하나는 기존 프로젝트를 .net 6으로 옮기고 컨트롤러를 최소 API로 변환하는 것이었습니다.
프로세스가 쉽다는 것을 알았지만 업로드 엔드포인트에 대한 테스트가 실패했을 때 놀랐습니다.
최소 API 끝점으로 변환한 후 구현은 이랬습니다. 👇
app.MapPost("/upload",
async Task<IResult>(IFormFile request) =>
{
if (request.Length == 0)
return Results.BadRequest();
await using var stream = request.OpenReadStream();
var reader = new StreamReader(stream);
var text = await reader.ReadToEndAsync();
return Results.Ok(text);
});
그리고 이것을 테스트하십시오. 👇
await using var application = new Application();
using var client = application.CreateClient();
using var formData = new MultipartFormDataContent();
await using var file = File.OpenRead("text.txt");
var streamContent = new StreamContent(file);
formData.Add(streamContent, "file", "text.txt");
var response = await client.PostAsync("/upload",
formData);
response.StatusCode.Should().Be(HttpStatusCode.OK);
var data = await response.Content.ReadAsStringAsync();
data.Should().Be("\"Hello World!\"");
예상했던 200 OK 상태 코드는 이제 415 Unsupported Media Type 🤔
그것은 이상했다. 내 첫 번째 생각은 해당 끝점에서 허용하는 콘텐츠 유형을 정의하지 못했다는 것입니다.
.Accepts<IFormFile>("multipart/form-data");
위의 코드가 OpenAPI 메타데이터를 추가하는 것에 관한 것이므로 내가 어리석었다는 것을 깨달았습니다. 😂
그러다 드디어 알았다. 최소 API는 콘텐츠가 JSON이라는 가정 하에 속성을 바인딩하려고 합니다.
어떻게 처리합니까?
HttpRequest 요청을 인수로 받아야 했습니다.
그런 다음 양식을 읽고 파일을 찾을 수 있었습니다.
app.MapPost("/upload",
async Task<IResult>(HttpRequest request) =>
{
if (!request.HasFormContentType)
return Results.BadRequest();
var form = await request.ReadFormAsync();
var formFile = form.Files["file"];
if (formFile is null || formFile.Length == 0)
return Results.BadRequest();
await using var stream = formFile.OpenReadStream();
var reader = new StreamReader(stream);
var text = await reader.ReadToEndAsync();
return Results.Ok(text);
});
결국 약간의 추가 노력이 필요하지만 큰 문제는 아닙니다. 향후 버전에서는 이를 수행하는 간단한 방법이 있을 수 있습니다.
이 정보가 도움이 되었기를 바랍니다! 이와 같은 더 많은 팁을 얻으려면 저를 팔로우하고 계속 연락하세요!
Reference
이 문제에 관하여(ASP.NET 최소 API를 사용하여 파일 업로드), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/gsferreira/uploading-files-with-aspnet-minimal-apis-2036텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)