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
Preview versions from the develop branch are available via GitHub Packages. Use these if you are using ASP.NET Core 3.
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