This repository contains an experimental implementation of the GraphQL multipart request spec based on ASP.NET Core.
You can install the latest version via NuGet.
PM> Install-Package GraphQL.Upload.AspNetCore
Register the middleware in your Startup.cs (in this case we're also using graphql-dotnet/server).
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<MySchema>()
.AddGraphQLUpload()
.AddGraphQL();
}
public void Configure(IApplicationBuilder app)
{
app.UseGraphQLUpload<MySchema>()
.UseGraphQL<MySchema>();
}
Register a FormFileConverter
within your MySchema.cs.
public class MySchema : Schema
{
public MySchema()
{
Query = new Query();
Mutation = new Mutation();
RegisterValueConverter(new FormFileConverter());
}
}
Use the upload scalar in your resolvers. Files are exposed as IFormFile
.
Field<StringGraphType>(
"singleUpload",
arguments: new QueryArguments(
new QueryArgument<UploadGraphType> { Name = "file" }),
resolve: context =>
{
var file = context.GetArgument<IFormFile>("file");
return file.FileName;
});
Take a look at the tests and the sample and run some of the cURL requests the spec lists if you are curious.
CMD:
curl localhost:54234/graphql ^
-F operations="{ \"query\": \"mutation ($file: Upload!) { singleUpload(file: $file) { name } }\", \"variables\": { \"file\": null } }" ^
-F map="{ \"0\": [\"variables.file\"] }" ^
-F 0=@a.txt
Bash:
curl localhost:54234/graphql \
-F operations='{ "query": "mutation ($file: Upload!) { singleUpload(file: $file) { name } }", "variables": { "file": null } }' \
-F map='{ "0": ["variables.file"] }' \
-F 0=@a.txt
This middleware implementation only parses multipart requests. The sample app uses additional middleware that handles other cases (e.g. POST
with application/json
).
- Make sure the implementation behaves according to the spec
- Add convenience extension methods for
ServiceCollection
andApplicationBuilder
that register the neccessary types - Feature parity with the reference implementation
- End to end sample with web based client