【问题标题】:Uploading files with two different keys in Asp.net Core Web Api and Postman在 Asp.net Core Web Api 和 Postman 中使用两个不同的密钥上传文件
【发布时间】:2021-07-08 05:07:42
【问题描述】:

我有一个表(课程),课程表(图像名和文件名)的两列应该有课程图像和课程文件,我可以成功发布文件,但图像总是返回 null。我的问题是,我怎样才能发布两个文件,有两个不同的键?如果我想为 CourseFile 发送超过 1 个文件,我该怎么做?

 public class FIleUploadAPI
    {
        public IFormFile FileName { get; set; }
        public IFormFile ImageName { get; set; }
        public string courseDto { get; set; }

    }

  [HttpPost]
    public async Task<ApiResult<CourseResultDtoForPublic>> Create([FromForm] FIleUploadAPI objfile, CancellationToken cancellationToken)
    {

        await UploadFile(objfile);
        CourseDto courseDtoDeserialize = JsonConvert.DeserializeObject<CourseDto>(objfile.courseDto);
        courseDtoDeserialize.FileName = objfile.FileName.ToString();
        courseDtoDeserialize.ImageName = objfile.ImageName.ToString();
        var model = courseDtoDeserialize.ToEntity(mapper);

        await courseRepository.AddAsync(model, courseDtoDeserialize.MajorId, cancellationToken);

        var dto = await courseRepository.TableAsNoTracking.ProjectTo<CourseResultDtoForPublic>(mapper.ConfigurationProvider)
             .FirstOrDefaultAsync(c => c.Id == model.Id, cancellationToken);
        return dto;



    }

    [HttpPost]
    [Route("/api/Course/UploadFile")]
    //[RequestFormLimits(MultipartBodyLengthLimit = 209715200)]
    //[RequestSizeLimit(209715200)]
    public async Task<string> UploadFile([FromForm]FIleUploadAPI objfile)
    {
        if (objfile.FileName.Length > 0)
            
        {
            try
            {
                if (!Directory.Exists(_environment.WebRootPath + "\\uploads\\"))
                {
                    Directory.CreateDirectory(_environment.WebRootPath + "\\uploads\\");
                }
                using (FileStream filestream = System.IO.File.Create(_environment.WebRootPath + "\\uploads\\" + objfile.FileName.FileName))
                {
                    objfile.FileName.CopyTo(filestream);
                    filestream.Flush();
                    return "\\uploads\\" + objfile.FileName.FileName;
                }
            }
            catch (Exception ex)
            {
                 return ex.ToString();
            }
        }

        if (objfile.ImageName.Length > 0)

        {
            try
            {
                if (!Directory.Exists(_environment.WebRootPath + "\\uploads/CourseImages\\"))
                {
                    Directory.CreateDirectory(_environment.WebRootPath + "\\uploads/CourseImages\\");
                }
                using (FileStream filestream = System.IO.File.Create(_environment.WebRootPath + "\\uploads/CourseImages\\" + objfile.ImageName.FileName))
                {
                    objfile.ImageName.CopyTo(filestream);
                    filestream.Flush();
                    return "\\uploads/CourseImages\\" + objfile.ImageName.FileName;
                }
            }
            catch (Exception ex)
            {
                return ex.ToString();
            }
        }
        
        else
        {
            return "Unsuccessful";
        }
        


    }

【问题讨论】:

  • I can post file successfully, but image returns null alway你的意思是postman发布的formdata没有像预期的那样绑定到你的action参数FIleUploadAPI objfile吗?
  • CourseDto 和 FileName 参数从邮递员那里绑定正确,但 ImageName 将 null 值返回给我的操作参数,尽管它在邮递员上有值

标签: api asp.net-core web asp.net-web-api postman


【解决方案1】:

公共 IFormFile ImageName { get;放; }

CourseDtoFileName 参数从邮递员那里绑定正确,但 ImageName 将 null 值返回给我的操作参数

请注意,模型绑定会从请求中的值中查找与 property_name(或 parameter_name)的匹配项,在您的屏幕截图中,我们可以发现您使用 ImagName 指定键,如下所示,而不是 ImageName,后者导致它无法很好地将值绑定到属性。

请尝试在邮递员中将其更改为ImageName,然后它应该可以正常工作。

有关模型绑定如何工作的更多信息,请查看此文档:

https://docs.microsoft.com/en-us/aspnet/core/mvc/models/model-binding?view=aspnetcore-5.0

【讨论】:

  • 是的,问题是我写错了图像名,这是一个错误!感谢您的回复。
猜你喜欢
  • 1970-01-01
  • 2017-05-13
  • 1970-01-01
  • 2020-08-25
  • 2016-11-14
  • 2018-07-05
  • 1970-01-01
  • 2012-11-22
  • 1970-01-01
相关资源
最近更新 更多