Uploading files
Apollo Kotlin supports file uploads via the GraphQL multipart request specification with a few caveats:
Uploading files with GraphQL is most often suitable for proof-of-concept applications. In production, using purpose-built tools for file uploads may be preferable. Refer to this blog post for possible approaches and their advantages and disadvantages.
Neither the Apollo Router Core nor GraphOS Router support
multipart/form-data
uploads.
Uploading files with Apollo Kotlin
First, add the following custom scalar mapping to the Apollo Gradle plugin configuration:
1apollo {
2 service("service") {
3 mapScalarToUpload("Upload")
4 }
5}
In this example, the GraphQL schema defines a custom scalar type named Upload
. You can use a different name as needed for your schema.
Upload
, because the mapScalarToUpload
method registers it automatically.Now let's consider a mutation that takes an Upload
as a parameter:
1mutation SingleUpload($file: Upload!) {
2 singleUpload(file: $file) {
3 id
4 path
5 filename
6 mimetype
7 }
8}
Create an instance of Upload
using one of the factory methods:
1// If you're on Android/JVM, you can turn a File into an upload
2val upload = File.toUpload("application/json")
3
4// On multiplatform, you can use `DefaultUpload`
5val upload = DefaultUpload.Builder()
6 .fileName("filename.txt")
7 .content { sink ->
8 okioSource.use { sink.writeAll(it) }
9 }
10 .build()
And execute your mutation:
1val response = apolloClient.mutation(SingleUploadMutation(file = upload)).execute()