通过web api在sqlite数据库中上传图像



我正在c#中创建一个Web应用程序,我需要将一个html表单中的图像上传到我的数据库中
我尝试过这样做,但由于安全问题,二进制格式化程序不能在api控制器中使用。

[HttpGet("imageUploadEndpoint")]
public IActionResult bytesImage([FromForm] object image)
{
BinaryFormatter bf = new BinaryFormatter();
MemoryStream ms = new MemoryStream();
bf.Serialize(ms, image);
//ms.ToArray() should then be uploaded to my sqlite database via entityframework in byte[] format 
return Ok(ms.ToArray()); //this return was just to see what happened
}

---图片上传到API已解决---

现在,我需要将图像放入一个带有entityframework的sqlitedb中。我该怎么做?

将映像上传到GET端点不是一个好主意,因为它们没有请求体,也不应该更改服务器状态(MDN(。

相反,我建议您使用POST端点和到IFormFileCollection的数据绑定。我在标准MVC控制器中使用它,但不知道它是否也能在ApiController中工作。

[HttpPost("imageUploadEndpoint")]
public async Task<IActionResult> Upload(IFormFileCollection files)
{
foreach (IFormFile file in files)
{
MemoryStream ms = new MemoryStream();
await file.CopyToAsync(ms);
}
return Ok();
}

在我的一个开源项目中,你可以找到用ASP上传图像的完整实现。NET核心MVC(GitHub(。

更新以存储在数据库中

虽然我建议将照片存储为文件,但您可以创建一个EF Core数据库上下文和一个类似的实体:

public class FileDbContext : DbContext
{
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<File>().HasKey(f => f.Id);
}
}
public class File
{
public int Id { get; set; }
public byte[] Data { get; set; }
}

现在你可以扩展你的控制器:

private readonly FileDbContext db; // Use constructor injection
[HttpPost("imageUploadEndpoint")]
public async Task<IActionResult> Upload(IFormFileCollection files)
{
foreach (IFormFile file in files)
{
using MemoryStream ms = new MemoryStream();
await file.CopyToAsync(ms);
File dbFile = new File { Data = ms.ToArray() };
db.Set<File>().Add(dbFile);
}
await db.SaveChangesAsync();
return Ok();
}

我以这种方式解决了上传问题:

[HttpPost("endpoint")]
public async Task<IActionResult> Upload(IFormFileCollection image)
{
using (MemoryStream fileStream = new MemoryStream()) //img object creation
{
await image[0].CopyToAsync(fileStream);
var img = new { fileStream = fileStream.ToArray(), contentType = image[0].ContentType };
return File(img.fileStream(), img.contentType)
}
}

我将img对象作为BLOB数据值放在sqlitedb中。

我的解决方案如下-我尝试使用最小API(.net7(以下是型号

public class Photo

{公共IFormFile?文件{get;set;}公共静态异步ValueTask<照片>BindAsync(HttpContext上下文,ParameterInfo参数({var form=等待上下文。要求ReadFormAsync((;var file=form.Files["file"];返回新照片{文件=文件};}}

此外,我的用户配置文件数据模型如下:

public class UserProfile {
public int UserProfileId { get; set; }
public string Name { get; set; }
public string LastName { get; set; }
public string MiddleName { get; set; }
public DateTime? DOB { get; set; }
public string Address { get; set; }
public string State { get; set; }
public string Country { get; set; }
public int? Zipcode { get; set; }
public string AlterEmail { get; set; }
public string Moblie { get; set; }
public string Phone { get; set; }
public byte[] Avatar { get; set; } = new byte[0];
public DateTime? CreatedOn { get; set; }
public DateTime? UpdatedOn { get; set; }
public virtual LoginEntity? Login { get; set; }

}

然后使用最小API端点:

loginGroup.MapPost("/upload", async (Photo photo, IndOMDBContext db) =>
{
var reader = new StreamReader(photo?.File.OpenReadStream());
var text = await reader.ReadToEndAsync();
var avatarCoded = Encoding.ASCII.GetBytes(text);
var userProfile = await db.UserProfile.Where(p => p.UserProfileId == 2).FirstOrDefaultAsync();
userProfile.Avatar = avatarCoded;
await db.SaveChangesAsync();
return Results.Ok(photo?.File.Length);
}).Accepts<Photo>("multipart/form-data");
}

最新更新