#c# #asp.net-core #.net-core #asp.net-web-api #postman
Вопрос:
Я создал один API, и он добавляет данные в базу данных со значениями и изображением.
В postman я вызываю это и устанавливаю изображение в форме-данные и другие значения в формате raw в JSON, но все равно в изображении я получаю нулевое значение в объекте исходного кода. Ниже приведены скриншоты.
Мне нужна помощь в двух вещах :
- Почему я получаю нулевое значение изображения в исходном коде, пожалуйста, проверьте ниже изображение.
- Как я могу отправить изображение и данные с помощью почтальона, проверьте скриншоты ниже, все ли в порядке с тем, что я пробовал ?
Первый снимок экрана-почтальон, на котором я отправляю данные в формате json :
Второй снимок экрана с почтальоном, на котором я отправляю изображение в том же запросе в почтальоне
Теперь на третьем изображении вы можете видеть, что на изображении вместо значений отображается значение Null.
Так что я не понимаю, почему изображение становится нулевым..Ниже приведен код для этого
public async Tasklt;intgt; Create(UserPreference _object) { if(_object.Image != null) { var webRootPath = hostingEnv.WebRootPath; var fileName = Path.GetFileName(_object.Image.FileName); var filePath = Path.Combine(hostingEnv.WebRootPath, "images\User", fileName); using(var fileStream = new FileStream(filePath, FileMode.Create)) { await _object.Image.CopyToAsync(fileStream); } _object.ImagePath = filePath; } var obj = await applicationDbContext.UserPreferences.AddAsync(_object); return applicationDbContext.SaveChanges(); }
[HttpPost] [Route("CreateUserPreference")] public async Tasklt;ActionResultgt; CreateUserPreference([FromBody] UserPreference userPreference) { if (ModelState.IsValid) { try { var userPreferenceId = await _userPreference.Create(userPreference); if (userPreferenceId gt; 0) return Ok("User Preference has added"); } catch(Exception) { return BadRequest(); } } return BadRequest(); } [Display(Name = "Name")] public string Name { get; set; } = ""; [Display(Name = "Location")] public string Location { get; set; } = ""; [Display(Name = "Date of Birth")] public DateTime DateOfBirth { get; set; } [Display(Name = "About Me")] public string AboutMe { get; set; } = ""; [Display(Name = "Match Preference")] public string MatchPreference { get; set; } = ""; [Display(Name = "Play Score")] public string PlayScore { get; set; } = ""; [Display(Name = "Location")] public string LocationPreference { get; set; } = ""; [Display(Name = "CreatedOn"), DataType(DataType.Date)] public DateTime CreatedOn { get; set; } = DateTime.Now; [Display(Name ="Upload Photo")] public string ImagePath { get; set; } = ""; [NotMapped] public IFormFile Image { get; set; } [ForeignKey("User")] public int UserId { get; set; } public virtual User User { get; set; }
Комментарии:
1. Привет, он отправил фотографию почтальону на втором изображении, которое вы прикрепили? Еще один вопрос, который у меня есть, заключается в том, правильно ли вы определили свой класс для полученных данных?
Ответ №1:
Вы не можете отправить данные формы и текст JSON одновременно, чтобы решить вашу проблему, отправьте изображение и другую информацию в качестве даты формы Для получения более подробной информации см. скриншот
Ответ №2:
Чтобы отправить изображение и данные с помощью почтальона, вы должны использовать тип содержимого форма-данные.
Выберите тело =gt; форма-данные. Клавиша столбца имеет селектор. Для файла выберите тип файла и выберите файл. Чтобы отправить данные в одно и то же время, вам придется разделить ваш json в паре ключ-значение.
И удалите атрибут [FromBody] из действия. Он используется только для типа содержимого: приложение/json, но для вашего типа содержимого: составные/данные формы;
Комментарии:
1. Я пробовал таким образом, но все равно получаю ошибку «заголовок»: «Неподдерживаемый тип носителя».,
2. @Nic Можете ли вы, пожалуйста, опубликовать фотографию вкладки «Данные формы» почтальона? Вам не нужно заполнять все ключи для теста . пары было бы достаточно
3. Я добавил скриншот в конце вопроса.. вы можете это проверить.
4. @Nic Спасибо, но он вызывает действие CreateUserPreference, а не Create. Можете ли вы опубликовать его, пожалуйста? Заголовка было бы достаточно
5. Я добавил этот метод..пожалуйста, проверьте его
Ответ №3:
Почтальон не позволяет вам отправлять два разных типа форм одновременно таким образом. В вашем вопросе речь идет либо об отправке полезной нагрузки JSON, либо о двоичном содержимом вашего изображения.
Поэтому вместо этого добавьте файл и полезную нагрузку JSON на экран данных формы, как это:
Почтальон автоматически установит Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
заголовок, а затем обработает фактическое тело следующим образом:
----WebKitFormBoundary7MA4YWxkTrZu0gW Content-Disposition: form-data; name="image"; filename="/C:/Users/xyz/Downloads/hystrix-dashboard-netflix-api-example-iPad.png" Content-Type: image/png (data) ----WebKitFormBoundary7MA4YWxkTrZu0gW Content-Disposition: form-data; name="data"