You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 01:05:56