.NET Core-如何上传JSON文件?

时间:2018-09-05 13:23:57

标签: json asp.net-mvc api asp.net-core

我正在尝试上载JSON文件以便从中读取值并将其保存在数据库中,但是我对此有问题。我的控制器代码如下:

[Produces("application/json")]
[Route("api/[controller]")]
[ApiController]
public class ImportController : ControllerBase
{

    private readonly DatabaseContext dbContext;

    public ImportController(DatabaseContext dbContext)
    {
        this.dbContext = dbContext;
    }

    [HttpPost]
    public IActionResult ImportData(IFormFile file)
    {
        var content = string.Empty;

        using (var reader = new StreamReader(file.OpenReadStream()))
        {
            content = reader.ReadToEnd();
        }

        List<UserModel> userObjects = null;
        try
        {
            userObjects = JsonConvert.DeserializeObject<List<UserModel>>(content);
        }
        catch
        {
            return BadRequest();
        }

        foreach (var user in userObjects)
        {

             UserModel us = new UserModel
             {
                 Username = user.Username,
                 Password = user.Password
             };

             dbContext.User.Add(us);
             dbContext.SaveChanges();
        }

        return Ok();
    }

}

我正在使用Postman发送JSON数据,但是只要我尝试这样做,都会收到以下响应:

  

{“用户名”:[“输入无效。”]}

当我尝试将JSON数据作为raw-> application / json或

发送时
  

{“”:[“输入无效。”]}

当我尝试通过键为“ file”和test.json文件为值的表单数据发送它时。

您能指引我正确的方向吗?我尝试将[FromBody] UserModel user用作操作的参数,但这只允许我处理一个JSON字符串。

3 个答案:

答案 0 :(得分:1)

您可以使用[FromBody] IEnumerable<UserModel> users处理许多行。在这种情况下,json应该看起来像:

[
 {
  "userName": "name",
  "password": "password",
 },
 {
  "userName": "name1",
  "password": "password1",
 }
]

答案 1 :(得分:0)

您需要以一种或另一种方式标准化您的方法。如果要接受JSON,则使用List<UserViewModel>属性绑定到类型为[FromBody]的操作参数,并在客户端使用JavaScript的FileReader来获取加载的实际内容归档并发布内容,而不是文件。

如果您想通过文件上传来进行操作,则可以保持原样,但是您还需要发送自己的“ JSON”作为文件上传。这可以通过在JavaScript中使用FormData并从JSON对象作为字符串手动创建Blob来实现。

长短短短,无论选择哪种方式,都应统一。在同一操作中,无法同时发布JSON对象和恰好是扩展名为.json的文本文件。

答案 2 :(得分:0)

我解决了它...我要做的就是删除[ApiController]属性。具有该属性会导致应用程序根本不访问我的ImportData方法。