Enhances Apollo for intuitive file uploads via GraphQL mutations or queries. Use with apollo-upload-server.
- > 2% market share browsers and React Native supported.
- MIT license.
Install with npm:
npm install apollo-upload-client
Setup Apollo Client with a special network interface:
importApolloClientfrom'apollo-client'import{createNetworkInterface}from'apollo-upload-client'constclient=newApolloClient({networkInterface: createNetworkInterface({uri: '/graphql'})})Alternatively enable query batching:
importApolloClientfrom'apollo-client'import{createBatchingNetworkInterface}from'apollo-upload-client'constclient=newApolloClient({networkInterface: createBatchingNetworkInterface({uri: '/graphql'})})Also setup apollo-upload-server.
Once setup, you will be able to use FileList, File and ReactNativeFile instances anywhere within mutation or query input variables.
With apollo-upload-server setup, the files upload to a temp directory. Upload input type metadata replaces file instances in the arguments received by the resolver. See the server usage.
See server usage for this example.
importReactfrom'react'import{graphql,gql}from'react-apollo'exportdefaultgraphql(gql` mutation updateUserAvatar($userId: String!, $avatar: Upload!) { updateUserAvatar(userId: $userId, avatar: $avatar) { id } }`)(({ userId, mutate })=>{consthandleChange=({ target })=>{if(target.validity.valid){mutate({variables: {
userId,avatar: target.files[0]}}).then(({ data })=>console.log('Mutation response:',data))}}return(<inputtype="file"accept={'image/jpeg,image/png'}requiredonChange={handleChange}/>)})See server usage for this example.
importReactfrom'react'import{graphql,gql}from'react-apollo'exportdefaultgraphql(gql` mutation updateGallery($galleryId: String!, $images: [Upload!]!) { updateGallery(galleryId: $galleryId, images: $images) { id } }`)(({ galleryId, mutate })=>{consthandleChange=({ target })=>{if(target.validity.valid){mutate({variables: {
galleryId,images: target.files}}).then(({ data })=>console.log('Mutation response:',data))}}return(<inputtype="file"accept={'image/jpeg,image/png'}multiplerequiredonChange={handleChange}/>)})React Native polyfills FormData under the hood and objects with the properties uri, type and name substitute window.File. Assuming all objects with those properties in variables are files would be risky. Use ReactNativeFile instances in query or mutation variables to mark files for upload:
import{ReactNativeFile}from'apollo-upload-client'// ✂// Single fileconstfile=newReactNativeFile({uri: uriFromCameraRoll,type: 'image/jpeg',name: 'photo.jpg'})// Multiple filesconstfiles=ReactNativeFile.list({uri: uriFromCameraRoll1,type: 'image/jpeg',name: 'photo-1.jpg'},{uri: uriFromCameraRoll2,type: 'image/jpeg',name: 'photo-2.jpg'})// ✂