JayantaChatterjee Ответов: 1

Как загрузить файл с данными из angular 8 в ASP.NET ядро 3 веб-api


Всем Привет,
Я создал веб-API .net core(v3) и угловой проект, поэтому я пытаюсь отправить объект, который будет содержать файл и другие данные (например, имя, продолжительность и т. д.).

Мой код углового компонента:-
 saveMovie() {
    this.submitted = true;
    if (this.movieFormGp.invalid) {
      return;
    }
    this.movieFormGp.patchValue({ rating: this.currentRate });
    let movieData= new FormData();
    movieData.append("name", this.movieFormGp.get('name').value);
    movieData.append("Duration", this.movieFormGp.get('duration').value);
    movieData.append("Review", this.movieFormGp.get('review').value);   
    movieData.append("GenresIDs",JSON.stringify( [4,6]));   
movieData.append("PosterImg",this.posterImage);

console.log(movieData);
    this.movieService.addMovie(movieData).subscribe((resp)=>{
      console.log(resp);
    },error=>{
      console.error(error);
    })
  }


Угловой код Серви:-
 headers={
    headers: new HttpHeaders({
      'enctype': 'multipart/form-data',
      'Accept': 'application/json'
    })
};
addMovie(movie:any)
  { 
    return this.http.post<any>(environment.baseAPIUrl+'Movies/addMovie',movie);
  }


.сетевая модель:-
public class CreateMovieDTO
    {
        public int Id { get; set; }
        [Required]
        public string Name { get; set; }
        public string Duration { get; set; }
        public string Review { get; set; }       
        public List<int> GenresIDs { get; set; }
        public bool IsFavorite { get; set; }
        public DateTime AddedOn { get; set; }       
        public IFormFile PosterImg { get; set; }
        public CreateMovieDTO()
        {
            GenresIDs = new List<int>();
        }
    }


Метод API:-
 [Route("api/[controller]")]
    [ApiController]
    [AllowAnonymous]

    public class MoviesController : ControllerBase
    {
 private readonly IMovieRepository _repository;
        private readonly DataContext _context;

        public MoviesController(IMovieRepository repository, DataContext context)
        {
            _repository = repository;
            _context = context;
        }
 [HttpPost("addMovie")]
        public async Task<IActionResult> AddMovie([FromForm] CreateMovieDTO movieDTO)
        {
            try
            {
                if (movieDTO == null)
                {
                    return BadRequest("object is null");
                }
                var reqFile = Request.Form.Files;
                var movie = new Movie()
                {                   
                    Name = movieDTO.Name,                   
                    Duration = movieDTO.Duration,
                    Review = movieDTO.Review,
                };

                foreach (var item in movieDTO.GenresIDs)
                {
                    var genre = await _repository.GetGenre(item);
                    movie.MovieGenres.Add(new MovieGenres { Genres = genre, Movie = movie });
                }
                _repository.Add<Movie>(movie);
                var response = await _repository.SaveAll();
                return Ok(response);
            }
            catch (Exception exp)
            {

                return BadRequest(exp);
            }
        }
}


Что я уже пробовал:

Если я пошлю только Данные JSON без файла и [FromBody] тогда это работает нормально, но если я добавлю файл с виде FormData затем в методе API все свойства равны нулю хотя его ударил метод APi.
если я использую [Из формы] с formdata тогда он попадает не в метод API, а в Сеть его показывает статус 200

Пожалуйста помочь..

Заранее спасибо.
Джаянта

1 Ответов

Рейтинг:
0

Sandeep Mewara

Веб-API встроенные средства форматирования поддерживают только следующие типы носителей: application/json, text/json, application/xml, text/xml и application/x-www-form-urlencoded


Теперь, в вашем контексте, вы пытаетесь сделать:

API method that has to send form-data format to the server

Это средство:
1. Вы должны убедиться, что сервер принимает несколько форматов в качестве полезной нагрузки типа контента.
2. Как только вы в этом убедитесь, то для multipart/form-data, который является тем, что вы посылаете, посмотрите на Веб-API ASP.NET : MultipartDataMediaFormatter[^]

Попробуйте.


JayantaChatterjee

Спасибо,
Я проверил пункты, которые вы упомянули. Это выглядит хорошо из моего приложения.

В моем случае я добавляю дополнительный заголовок HTTP-запроса с углового. поэтому после удаления этой части заголовка из http - запроса он начал работать.

Sandeep Mewara

Хорошо знать, что ваша проблема решена! :большой палец вверх: