.NET 6 API:前端图片上传至数据库的后端实现疑问
问题:.NET 6中实现Artist图片的接收与存储
背景
- 初级开发者,首个项目,负责后端API开发,首次接触后端,几乎不懂C#和.NET技术栈
- 前端技术栈:Nextjs、TypeScript
- 后端技术栈:.NET 6、C#
问题说明
需将图片上传至Artist对象,目前仅用字符串存储前端图片路径。将自行处理前端接收图片逻辑并创建PUT上传端点,询问如何在.NET中实现图片的接收与存储?
Artist实体
namespace BookingAPI.Entities { public class Artist { public string Id { get; set; } public string Name { get; set; } = null!; public string Description { get; set; } public string? Image { get; set; } } }
控制器中的CreateArtist方法
// POST /events/{eventId}/program/artists // Create new artist in Program -> Artists [HttpPost] [Route("/events/{eventId}/program/artists")] public async Task<ActionResult<EventArtistDto>> CreateEventArtistAsync(string eventId, CreateEventArtistDto createEventArtistDto) { Artist artist = new() { Id = Guid.NewGuid().ToString(), Name = createEventArtistDto.Name, Description = createEventArtistDto.Description, Image = createEventArtistDto.Image, }; await repository.CreateEventArtistAsync(eventId, artist); return artist.AsDto(); // add return body? }
内存仓储中的CreateArtist方法
public async Task CreateEventArtistAsync(string eventId, Artist artist) { var eventIndex = events.FindIndex(existingEvent => existingEvent.Id == eventId); var existingEvent = events[eventIndex]; var artists = existingEvent.EventProgram.Artists; artists.Add(artist); await Task.CompletedTask; }
更新内容:尝试实现后的错误
控制器报错:Implicitly-typed variables must be initialized
内存仓储报错:Cannot implicitly convert type 'Microsoft.AspNetCore.Http.IFormFile' to 'string'
控制器中的UpdateImageInEventArtistAsync方法
//PUT /events/{eventId}/program/artists/{artistId}/image // Update the Image in the Artist [HttpPost] [Route("/events/{eventId}/program/artists/{artistId}/image")] public async Task<ActionResult<UpdateImageInEventArtistDto>> UpdateImageInEventArtistAsync(string eventId, string artistId, UpdateImageInEventArtistDto updateImageInEventArtistDto, [FromForm] IFormFile file) { // Get Program from Event var program = await repository.GetEventProgramAsync(eventId); var existingArtist = program.Artists.Where(artist => artist.Id == artistId).SingleOrDefault(); if (existingArtist is null) { return NotFound(); } var byteArrayImage; using (var stream = new MemoryStream()) { await file.CopyToAsync(stream); byteArrayImage = stream.ToArray(); } existingArtist.Image = Convert.ToBase64String(byteArrayImage); /* await repository.UpdateEventArtistAsync(eventId, artistId, existingArtist); */ await repository.UpdateImageInEventArtistAsync(eventId, artistId, byteArrayImage); return NoContent(); }
内存仓储中的UpdateImageInEventArtistAsync方法
public async Task UpdateImageInEventArtistAsync(string eventId, string artistId, IFormFile file) { var eventIndex = events.FindIndex(existingEvent => existingEvent.Id == eventId); var existingEvent = events[eventIndex]; var artists = existingEvent.EventProgram.Artists; var existingArtist = artists.Where(artist => artist.Id == artistId).SingleOrDefault(); existingArtist.Image = file; await Task.CompletedTask; }
内容的提问来源于stack exchange,提问作者Magnus Pladsen
相关产品推荐
相关产品推荐

