合并文本入库与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
相关产品推荐
相关产品推荐

