首页 > 解决方案 > 在 asp core web api 中混合 fileupload 和 raw json 是不可能的吗?

问题描述

几周以来,我一直在尝试让我的 API 接受文件上传,以及 json 中的其他原始数据。API 非常大,是为用户创建声明/请求而构建的。一方面是他们应该能够在需要时上传文件。我使用邮递员来测试 API。但是,正如我发现的那样,不可能混合发送原始 json 请求和表单数据来上传文件的方法。我已经尝试过模型绑定等来尝试解决这个问题,但我没有取得任何成功。我唯一的成功是当我在控制器中创建一个单独的文件上传方法时。但这并不是最佳选择,因为用户应该在上传其他信息/数据的同一请求中上传文件。

如果有人对如何解决这个问题有任何好主意,我将不胜感激。

我的控制器如下所示:

 [HttpPost]
 public async Task < IActionResult > AddRequest(Request model) {

   if (!ModelState.IsValid) {
     return BadRequest(ModelState);
   }

   try {
     await _request.AddRequest(model);
   } catch (Exception ex) {

     return BadRequest(ex.Message);
   }

   return Ok();
 }

控制器只处理 HttpPost 和请求。实际方法等位于 viewmodel 类中,如下所示:

     public async Task < bool > AddRequest(Request model) {
    
         bool CreateRequest = true;
         int requestID = 0;
         int claimID = 0;
    
         //First Create the Request
         foreach(Service item in model.Service) {
             //First Create the Request
             if (CreateRequest) {
    
               var parameters = new DynamicParameters();
    
               parameters.Add("WorkshopEmail", model.WorkshopEmail);
               parameters.Add("WorkshopContactperson", model.WorkshopContactperson);
               parameters.Add("WorkshopCellphone", model.WorkshopCellphone);
               parameters.Add("IncVat", model.IncVat); /
               parameters.Add("ExlVat", model.ExlVat);
    
               try {
                           var requestIDenum = await _sqlconnection.QueryAsync<int> 
                           ($ @ "INSERT INTO [dbo].[Request]

                           ([WorkshopEmail], [WorkshopContactperson], [WorkshopCellphone], [IncVat],
                           [ExlVat]) VALUES(@WorkshopEmail, @WorkshopContactperson, @WorkshopCellphone, 
                           @IncVat, @ExlVat); SELECT SCOPE_IDENTITY();
                           ",parameters);
                           requestID = requestIDenum.First(); CreateRequest = false;
    
                 }
                 catch (Exception ex) {
    
                   int hej = 0;
                 }
               }

AddRequest 方法持续了很长一段时间,有不同的选项。这个想法是文件上传可能类似于:

  if (item.fileuploadresults != null)
  {
  // add files to database here
  }

在邮递员中发送请求时,json 看起来像:

{
   "workshopEmail":"workshopemail",
   "workshopContactperson":"workshopcontactperson",
   "workshopCellphone":"workshopcellphone",
   "incVat":"7",
   "exlVat":"3",
   "Service":[
      // add service data
   ]

这是 api 的一部分,因为整体将是很多代码。但例如在“服务”中可以添加更多信息。

现在,是否不可能将文件上传添加到 api 并在邮递员中对其进行测试以将文件存储在数据库中?或者有没有一种方法可以在不在控制器中创建单独的方法的情况下继续对请求 api 进行计费?

标签: jsonasp.net-coreasp.net-web-apipostman

解决方案


我遇到了类似的问题,我做了一些黑客攻击,我不知道你是否可以,但在这里你可以做什么。

您的控制器方法需要处理多部分/表单数据请求,然后在此表单数据请求中您需要指定一个data字段,该字段将包含您的原始 JSON。之后,将一些带有唯一键的文件放入您的表单数据请求中,并将此键放入您的 JSON 中作为图像字段。最后,你会得到这样的请求

在此处输入图像描述

然后您可以创建一些需要修改请求数据的中间件,将文件数据放入 JSON 并将其映射到某个请求类


推荐阅读