You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

合并文本入库与AWS S3文件上传API时遭遇415错误求助

解决合并接口415错误及功能异常问题

问题根源

415错误(不支持的媒体类型)的核心原因:

  • 合并接口需要同时接收表单文本数据和文件,必须使用multipart/form-data请求格式,但当前接口未明确指定复杂类型参数的绑定来源,ASP.NET Core默认会尝试从JSON Body解析BusinessStream,导致解析失败。
  • 未对IFormFile参数做非空校验,可能引发空引用异常。

修复步骤及优化代码

1. 明确参数绑定方式

给BusinessStream参数添加[FromForm]特性,告诉框架从表单字段中解析该复杂类型。

2. 增加参数校验

在处理逻辑前检查formFile和文本数据是否为空,避免后续操作报错。

3. 加入事务处理

确保文件上传和数据库写入操作的原子性,避免出现文件上传成功但数据库保存失败的不一致情况。

4. 移除硬编码ID值

如果数据库中BusinessStreamId是自增主键,直接移除硬编码值,由数据库自动生成;若需前端传入,改为接收参数。

修改后的完整代码:

[HttpPost]
public async Task<ActionResult> PostTextAndFile([FromForm] BusinessStream businessStream, IFormFile formFile)
{
    // 参数校验
    if (businessStream == null || string.IsNullOrWhiteSpace(businessStream.BusinessStreamName))
    {
        return BadRequest("文本数据不能为空");
    }
    if (formFile == null || formFile.Length == 0)
    {
        return BadRequest("请选择要上传的文件");
    }

    var client = new AmazonS3Client(AccessID, SecretKey, RegionEndpoint.USEast1);
    var bucketExist = await AmazonS3Util.DoesS3BucketExistV2Async(client, BucketName);

    // 创建数据库实体(自增主键则删除BusinessStreamId硬编码)
    var stream = new BusinessStream()
    {
        // BusinessStreamId = Convert.ToInt64(1243), // 自增主键场景删除此行
        BusinessStreamName = businessStream.BusinessStreamName
    };

    // 事务确保操作原子性
    using (var transaction = await enugujobsdatabaseContext.Database.BeginTransactionAsync())
    {
        try
        {
            // 创建S3桶(不存在则创建)
            if (!bucketExist)
            {
                var bucketRequest = new PutBucketRequest()
                {
                    BucketName = BucketName,
                    UseClientRegion = true
                };
                await client.PutBucketAsync(bucketRequest);
            }

            // 上传文件到S3
            var objectRequest = new PutObjectRequest()
            {
                BucketName = BucketName,
                Key = $"{DateTime.Now:yyyy/MM/dd/HHmmss}-{formFile.FileName.Trim()}",
                InputStream = formFile.OpenReadStream(),
            };
            await client.PutObjectAsync(objectRequest);

            // 保存数据到数据库
            enugujobsdatabaseContext.BusinessStreams.Add(stream);
            await enugujobsdatabaseContext.SaveChangesAsync();

            // 提交事务
            await transaction.CommitAsync();

            return Ok("文本入库和文件上传均成功");
        }
        catch (Exception ex)
        {
            // 回滚事务
            await transaction.RollbackAsync();
            return StatusCode(StatusCodes.Status500InternalServerError, $"操作失败:{ex.Message}");
        }
    }
}

前端请求注意事项

发送请求时必须满足:

  • 设置请求头Content-Type: multipart/form-data
  • 将文本数据作为表单字段(如BusinessStreamName)传入
  • 将文件作为文件字段(对应接口的formFile参数名)上传

内容的提问来源于stack exchange,提问作者GIS Support EEDC

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 10:45:32