ASP.NET 최소 API를 사용하여 파일 업로드

8652 단어 dotnetdotnet6
.net 6 릴리스와 함께 Minimal APIs 으로 플레이하게 되어 매우 기뻤습니다.

내가 한 첫 번째 작업 중 하나는 기존 프로젝트를 .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);
    });


결국 약간의 추가 노력이 필요하지만 큰 문제는 아닙니다. 향후 버전에서는 이를 수행하는 간단한 방법이 있을 수 있습니다.

이 정보가 도움이 되었기를 바랍니다! 이와 같은 더 많은 팁을 얻으려면 저를 팔로우하고 계속 연락하세요!

좋은 웹페이지 즐겨찾기