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

使用HotChocolate GraphQL与Banana Cake Pop上传文件遇服务器错误求助

HotChocolate 文件上传404错误排查

问题背景

我正在使用HotChocolate NuGet包结合Banana Cake Pop实现GraphQL,已通过UploadType配置文件上传功能,配置代码如下:

builder.Services
                .AddGraphQLServer()
                .AddQueryType<Query>()
                .AddMutationType<Mutation>()
                .AddType<UploadType>()
                .AddTypeExtension<AuthorExtensions>()
                .AddMutationConventions();

在Banana Cake Pop中提交如下突变请求:

mutation ($input:UploadProfilePictureInput!){
  uploadProfilePicture(input: $input){
    author{
      id
    }
  }
}

变量:

{
  "input": {"file": "ts.json", "authorId": 1}
}

得到响应:

{
  "message": "",
  "name": "ServerError",
  "statusCode": 404,
  "statusText": "",
  "bodyText": ""
}

切换到Postman以表单数据形式提交,仍报相同404错误,但其他非文件上传的查询在Postman中可正常返回结果。

排查方向

  • 启用Multipart请求支持
    HotChocolate处理文件上传需要显式开启multipart请求支持,修改配置代码添加对应项:

    builder.Services
            .AddGraphQLServer()
            .AddQueryType<Query>()
            .AddMutationType<Mutation>()
            .AddType<UploadType>()
            .AddTypeExtension<AuthorExtensions>()
            .AddMutationConventions()
            .AddMultipartRequestSupport(); // 新增该行
    
  • 校验输入类型定义
    确认UploadProfilePictureInput中file字段的类型为Upload而非字符串:

    public class UploadProfilePictureInput
    {
        public Upload File { get; set; }
        public int AuthorId { get; set; }
    }
    

    同时确保突变方法参数正确接收该输入类型:

    public async Task<UploadProfilePicturePayload> UploadProfilePicture(UploadProfilePictureInput input, [Service] IAuthorRepository repository)
    {
        // 文件处理逻辑
    }
    
  • Banana Cake Pop提交方式修正
    在Banana Cake Pop中,不能直接在变量里填写文件名,需点击变量面板file字段对应的文件选择按钮,选择本地ts.json文件,而非手动输入字符串"ts.json"。

  • Postman表单数据格式规范
    Postman提交需遵循GraphQL multipart请求规范:

    • operations字段值为JSON格式的查询与变量:
      {
        "query": "mutation ($input:UploadProfilePictureInput!){ uploadProfilePicture(input: $input){ author{ id } } }",
        "variables": {"input": {"file": null, "authorId": 1}}
      }
      
    • map字段值为JSON,指定文件对应变量路径:
      { "0": ["variables.input.file"] }
      
    • 添加文件字段,键为0,选择本地ts.json文件。
  • 路由匹配检查
    确认GraphQL默认路由/graphql未被其他中间件拦截,或是否在配置时修改了路由路径,确保请求URL与服务配置路由一致。

内容的提问来源于stack exchange,提问作者jone selas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 14:32:48