C# 如何使用.NET Core API将图像文件上载到数据库?

C# 如何使用.NET Core API将图像文件上载到数据库?,c#,asp.net-mvc,asp.net-core,file-upload,asp.net-core-webapi,C#,Asp.net Mvc,Asp.net Core,File Upload,Asp.net Core Webapi,我正在创建一个用户可以发布的应用程序,类似于论坛。我尝试将图像和文本加载到数据库中,为此,我有两个表,它们都通过id关联。我知道如何加载文本内容,但我真的不知道如何处理图像内容。 我使用MVC视图和相应的控制器来使用API 我正在使用的模型: public class ForumThemeModel { public ForumThemeModel() { Themes = new HashSet<Theme>(); } //foru

我正在创建一个用户可以发布的应用程序,类似于论坛。我尝试将图像和文本加载到数据库中,为此,我有两个表,它们都通过id关联。我知道如何加载文本内容,但我真的不知道如何处理图像内容。 我使用MVC视图和相应的控制器来使用API

我正在使用的模型:

public class ForumThemeModel
{
    public ForumThemeModel()
    {
        Themes = new HashSet<Theme>();
    }

    //forum table
    [Key]
    public int IdForum { get; set; }
    public string PostTittle { get; set; }

    //theme table
    public int? Idtheme { get; set; }
    public string TextContent { get; set; }
    public int? IdForum { get; set; }
    public IFormFile ContentFile { get; set; } //where the image will be stored
    public string FileNameA { get; set; }
    public string FileType { get; set; }
}
用于UMTheMemodel的公共类
{
public ForumThemeModel()
{
主题=新的HashSet();
}
//论坛桌
[关键]
public int IdForum{get;set;}
公共字符串PostTitle{get;set;}
//主题表
公共int?Idtheme{get;set;}
公共字符串TextContent{get;set;}
公共int?IdForum{get;set;}
公共文件ContentFile{get;set;}//存储图像的位置
公共字符串FileNameA{get;set;}
公共字符串文件类型{get;set;}
}
进行后期创建的API控制器:

    [HttpPost]
    [Consumes("multipart/form-data")]
    [Route("createPost")]
    public async Task<IActionResult> createPost([FromBody]ForumThemeModel model)
    {
        Forum forum = new Forum();

        Theme theme = new Theme();

        var fileName = Path.GetFileName(model.FileNameA);
        var fileExt = Path.GetExtension(fileName);
        var newFileName = String.Concat(Convert.ToString(Guid.NewGuid()), fileExt);

        using(var target = new MemoryStream())
        {
            await model.ContentFile.CopyToAsync(target);
            theme.ContentFile = target.ToArray();
        }

        forum.PostTittle = model.PostTittle;
        theme.FileNameA = newFileName;
        theme.FileType = fileExt;

        var postTittle = new SqlParameter("@postTittle", forum.PostTittle);
        var textContent = new SqlParameter("@textContent", theme.TextContent);
        var content_file = new SqlParameter("@content_file", theme.ContentFile);
        var file_name_a = new SqlParameter("@file_name_a", theme.FileNameA);
        var FileType = new SqlParameter("@FileType", theme.FileType);

        //saves everything to database

        return Ok();
    }
[HttpPost]
[使用(“多部分/表单数据”)]
[路线(“createPost”)]
公共异步任务createPost([FromBody]用于UMTheMemodel模型)
{
论坛=新论坛();
主题=新主题();
var fileName=Path.GetFileName(model.FileNameA);
var fileExt=Path.GetExtension(文件名);
var newFileName=String.Concat(Convert.ToString(Guid.NewGuid()),fileExt);
使用(var target=new MemoryStream())
{
等待model.ContentFile.CopyToAsync(目标);
theme.ContentFile=target.ToArray();
}
forum.postitle=model.postitle;
theme.FileNameA=newFileName;
theme.FileType=fileExt;
var posttle=新的SqlParameter(“@posttle”,forum.posttle);
var textContent=新的SqlParameter(“@textContent”,theme.textContent);
var content\u file=新的SqlParameter(“@content\u file”,theme.ContentFile);
var file\u name\u a=新的SqlParameter(“@file\u name\u a”,theme.FileNameA);
var FileType=new-SqlParameter(“@FileType”,theme.FileType);
//将所有内容保存到数据库
返回Ok();
}
使用API的MVC控制器:

    [HttpPost]
    public IActionResult createPost(ForumThemeModel model)
    {
        HttpClient hc = new HttpClient();
        hc.BaseAddress = new Uri("https://localhost:44325/api/Users");

        var userPost = hc.PostAsJsonAsync<ForumThemeModel>("Users/createPost", model);

        userPost.Wait();
        
        //do something when the resquest result is successful
    }
[HttpPost]
public IActionResult createPost(用于Memodel模型)
{
HttpClient hc=新的HttpClient();
hc.BaseAddress=新Uri(“https://localhost:44325/api/Users");
var userPost=hc.PostAsJsonAsync(“Users/createPost”,model);
userPost.Wait();
//当重新请求结果成功时,请执行某些操作
}
MVC控制器的视图:

@model Huerbog.Models.Request.ForumThemeModel

@{
     ViewData["Title"] = "CreatePost";
 }
 <hr />
 <div class="row">
    <div class="col-12 col-md-9">
        <form enctype="multipart/form-data" asp-action="createPost">
           <div asp-validation-summary="ModelOnly" class="text-danger"></div>

           <div class="form-group h4">
              <label asp-for="PostTittle" class="control-label">Tittle</label>
              <input asp-for="PostTittle" class="form-control" />
              <span asp-validation-for="PostTittle" class="text-danger"></span>
           </div>
           <div class="form-group h4">
              <label asp-for="Content" class="control-label">Content of the post</label>
              <textarea rows="5" asp-for="Content" class="form-control"></textarea>
              <span asp-validation-for="Content" class="text-danger"></span>
           </div>
           <div class="form-group h4">
              <label asp-for="ContentFile" class="control-label">Imagen:</label><br />
              <input class="form-control-file" multiple asp-for="ContentFile" type="file" />
           </div>
           <div class="form-group h4">
              <input type="submit" value="Create post" class="btn btn-primary" />
           </div>
         </form>
    </div>
 </div>
@model Huerbog.Models.Request.ForumThemeModel
@{
ViewData[“Title”]=“CreatePost”;
}

窃窃私语 文章内容 Imagen:
因此,我阅读了有关上载图像或文件的内容,它表明在数据库中上载图像或不同类型的文件时,视图中应显示属性
enctype=“multipart/form data”
,由于该属性,发生了两件事:第一件事是当我将该属性保留在视图中时,MVC控制器不使用API控制器,但模型从文件或图像接收信息,如名称、文件类型等。第二件事是当我从视图中删除该属性时,在这种情况下,MVC控制器使用API控制器,但模型不包含任何有关文件或图像的内容。在这两种情况下,模型都会接收文本内容,但由于缺少有关图像的信息,数据库也不会保存文本内容

我不确定是否主要原因是
enctype=“multipart/form data”
atribute,但正如我之前所说,在上传图像之前,文本内容工作正常,并且
enctype=“multipart/form data”
不存在

我已经在img上传上停留了一段时间,我真的不知道怎么做,任何帮助都非常感谢

public-formfile-ContentFile{get;set;}

首先,请注意,
PostAsJsonAsync
方法会将模型数据序列化为JSON,然后发送到请求正文中,这对序列化
FormFile
没有意义,它会导致错误

要实现从MVC控制器操作使用API上载文件和其他数据的要求,可以参考以下示例代码

[HttpPost]
public async Task<IActionResult> CreatePost(ForumThemeModel model)
{
    var formContent = new MultipartFormDataContent();

    formContent.Add(new StringContent(model.PostTittle), "PostTittle");

    //...
    //for other properties, such as FileNameA, FileType etc
    //...

    formContent.Add(new StreamContent(model.ContentFile.OpenReadStream()), "ContentFile", Path.GetFileName(model.ContentFile.FileName));


    HttpClient hc = new HttpClient();
    hc.BaseAddress = new Uri("https://localhost:44325/api/Users/");

    var userPost = await hc.PostAsync("createPost", formContent);

    //...
[HttpPost]
公共异步任务CreatePost(用于UMTheMemodel模型)
{
var formContent=新的MultipartFormDataContent();
添加(新的StringContent(model.PostTitle),“PostTitle”);
//...
//用于其他属性,如FileNameA、FileType等
//...
添加(新的StreamContent(model.ContentFile.OpenReadStream()),“ContentFile”,Path.GetFileName(model.ContentFile.FileName));
HttpClient hc=新的HttpClient();
hc.BaseAddress=新Uri(“https://localhost:44325/api/Users/");
var userPost=wait hc.PostAsync(“createPost”,formContent);
//...
API行动

public async Task<IActionResult> createPost([FromForm]ForumThemeModel model) 
{
    //...
公共异步任务createPost([FromForm]用于UMTheMemodel模型)
{
//...