GraphQL+Go文件上传报错Unknown type 'Upload' 解决方法咨询
修复Go GraphQL文件上传"Unknown type 'Upload'"错误的方案
1. 确保服务器端正确注册Upload标量
Go的GraphQL库(如gqlgen)不会自动识别Upload标量,必须手动注册实现:
- 若使用gqlgen,先在
gqlgen.yml中配置标量映射:
models: Upload: model: github.com/99designs/gqlgen/graphql.Upload
执行命令重新生成代码:
go run github.com/99designs/gqlgen generate
- 若为自定义服务器实现,需手动注册
Upload标量的解析逻辑:
import ( "github.com/graphql-go/graphql" "github.com/graphql-go/graphql/language/ast" ) var UploadScalar = graphql.NewScalar(graphql.ScalarConfig{ Name: "Upload", Description: "The `Upload` scalar type represents a file upload.", Serialize: func(value interface{}) interface{} { return value }, ParseValue: func(value interface{}) interface{} { return value }, ParseLiteral: func(valueAST ast.Value) interface{} { return nil // 文件上传用multipart/form-data,无需处理字面量解析 }, })
将该标量加入schema的类型定义集合中。
2. 修正schema定义
在.graphqls文件中,确保scalar Upload声明在所有使用它的类型之前,保持标量名两端一致(不要随意改成FileUpload,除非服务器端同步注册对应名称的标量):
scalar Upload type Mutation { uploadFile(file: Upload!): Boolean! }
3. 正确发起文件上传请求
文件上传不能用普通JSON请求,必须使用multipart/form-data格式,结构如下:
operations字段:JSON字符串,包含GraphQL查询和变量定义map字段:JSON字符串,映射文件字段到变量位置- 文件字段:键名需与
map中的键对应
curl示例:
curl -X POST \ http://your-server-address/graphql \ -F operations='{"query": "mutation($file: Upload!) { uploadFile(file: $file) }", "variables": { "file": null }}' \ -F map='{"0": ["variables.file"]}' \ -F 0=@/path/to/your/target-file.txt
4. 服务器端处理上传逻辑
在resolver函数中正确接收Upload类型参数,以gqlgen生成的代码为例:
import ( "context" "io" "os" "github.com/99designs/gqlgen/graphql" ) func (r *mutationResolver) UploadFile(ctx context.Context, file graphql.Upload) (bool, error) { // 读取文件内容 content, err := io.ReadAll(file.File) if err != nil { return false, err } // 保存文件到磁盘或其他存储 err = os.WriteFile(file.Filename, content, 0644) return err == nil, err }
内容的提问来源于stack exchange,提问作者Stepan
相关产品推荐
相关产品推荐

