可以将 JsonPatchDocument 与 FromForm 和 IFormFile 一起使用吗?

问题描述 投票:0回答:1

我正在使用一个小型应用程序只是为了学习 .NET Core 和 C#。我有一个名为 Movie 的模型,其字段之一是用于存储图像的字节数组。我想知道如何使用 JsonPatchDocument 来更新该字段。

电影模型:

public class Movie
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int id_movie { get; set; }

    [Required]
    public string name_movie { get; set; }

    public byte[]? img_movie {  get; set; }

    public string? desc_movie { get; set; }

    public int duration_movie { get; set; }

    public type_class_movie class_movie { get; set; }

    public DateTime? created_at_movie { get; set; }

    public DateTime? updated_at_movie { get; set; }

    public int id_category_movie { get; set; }

    [ForeignKey("id_category_movie")]
    public Category? Category { get; set; }
}

public enum type_class_movie { Siete, Trece, Diesciseis, Dieciocho }

电影控制器:

 [HttpPatch("update_movie/{id_movie:int}", Name = "UpdateMovie")]
public IActionResult UpdateMovie(int id_movie, [FromForm] Movie movie, IFormFile imagen)
{
    try
    {
        if (!_mRepo.MovieExistsById(id_movie))
        {
            var errorResponse = new
            {
                StatusCode = 400,
                Message = "Movie doesn't exists"
            };

            return StatusCode(400, errorResponse);
        }

        using (var memoryStream = new MemoryStream())
        {
             await imagen.CopyToAsync(memoryStream);
             movie.img_movie = memoryStream.ToArray();
        }


        if (!_mRepo.UpdateMovie(entity))
        {
            var errorResponse = new
            {
                StatusCode = 500,
                Message = "An error ocurred while processing the request"
            };

            return StatusCode(500, errorResponse);
        }

        return StatusCode(200, new { updt_cat = entity });
    } 
    catch (Exception ex)
    {
        Console.WriteLine(ex.ToString());

        var errorResponse = new
        {
            StatusCode = "Error",
            Message = "An error occurred while processing the request."
        };

        return StatusCode(500, errorResponse);
    }
}

我喜欢 JsonPatchDocument 部分更新的工作方式,但我不知道如何使用它来获取可能包含图像的表单的部分更新,感谢任何帮助。

c# rest asp.net-core file-upload json-patch
1个回答
0
投票

当然有可能。你遵循这个教程吗? https://trycatchdebug.net/news/1211513/jsonpatchdocument-and-iformfile-in-c 根据这个文档,我认为你需要做以下修改:

        [HttpPatch("update_movie/{id_movie:int}", Name = "UpdateMovie")]
        //change mehtod to async
        public async Task<IActionResult> UpdateMovie(int id_movie, [FromForm] JsonPatchDocument<Movie> patchDocument, IFormFile imagen)
        {
            try
            {

                var movie = await _mRepoawait.MovieFindById(id_movie); // "MovieFindById implement from _dbcontext.Movies.FindAsync(id);

                if (movie == null)
                {
                    var errorResponse = new
                    {
                        StatusCode = 400,
                        Message = "Movie doesn't exists"
                    };

                    return StatusCode(400, errorResponse);
                }

                patchDocument.ApplyTo(movie); //use "ApplyTo" to update the "movie" model

                using (var memoryStream = new MemoryStream())
                {
                    await imagen.CopyToAsync(memoryStream);
                    movie.img_movie = memoryStream.ToArray();
                }

                if (!_mRepo.UpdateMovie(movie))    //"UpdateMovie" should have implement _dbcontext.SaveChangesAsync();
                {
                    var errorResponse = new
                    {
                        StatusCode = 500,
                        Message = "An error ocurred while processing the request"
                    };

                    return StatusCode(500, errorResponse);
                }

                return StatusCode(200, new { updt_cat = movie });
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());

                var errorResponse = new
                {
                    StatusCode = "Error",
                    Message = "An error occurred while processing the request."
                };

                return StatusCode(500, errorResponse);
            }
        }

您需要安装的软件包:

Microsoft.AspNetCore.JsonPatch

Microsoft.AspNetCore.Mvc.NewtonsoftJson

如果您的控制器具有

[ApiController]
属性,则 multipart/formdata 将不起作用。您需要更改program.cs,如下所示:

builder.Services.AddControllers().AddNewtonsoftJson().ConfigureApiBehaviorOptions(o => {
    o.SuppressInferBindingSourcesForParameters = true;
});

然后您可以使用邮递员来测试您的端点,如下所示:(更改电影名称和图像)

参考:https://learn.microsoft.com/en-us/aspnet/core/web-api/jsonpatch?view=aspnetcore-8.0

© www.soinside.com 2019 - 2024. All rights reserved.