apollo-upload-client
A terminating Apollo Link for Apollo Client that allows FileList
, File
, Blob
or ReactNativeFile
instances within query or mutation variables and sends GraphQL multipart requests.
Setup
Install with npm:
npm install apollo-upload-client
Apollo Boost doesn’t allow link customization; if you are using it migrate to a manual Apollo Client setup.
Apollo Client can only have 1 “terminating” Apollo Link that sends the GraphQL requests; if one such as apollo-link-http
is already setup, remove it.
Initialize the client with a terminating link using createUploadLink
.
Also ensure the GraphQL server implements the GraphQL multipart request spec and that uploads are handled correctly in resolvers.
Usage
Use FileList
, File
, Blob
or ReactNativeFile
instances anywhere within query or mutation variables to send a GraphQL multipart request.
See also the example API and client.
const { useMutation } = require("@apollo/react-hooks");
const gql = require("graphql-tag");
const MUTATION = gql`
mutation($files: [Upload!]!) {
uploadFiles(files: $files) {
success
}
}
`;
const UploadFile = () => {
const [mutate] = useMutation(MUTATION);
const onChange = ({ target: { validity, files } }) =>
validity.valid && mutate({ variables: { files } });
return <input type="file" multiple required onChange={onChange} />;
};
const { useMutation } = require("@apollo/react-hooks");
const gql = require("graphql-tag");
const MUTATION = gql`
mutation($file: Upload!) {
uploadFile(file: $file) {
success
}
}
`;
const UploadFile = () => {
const [mutate] = useMutation(MUTATION);
const onChange = ({
target: {
validity,
files: [file]
}
}) => validity.valid && mutate({ variables: { file } });
return <input type="file" required onChange={onChange} />;
};
const gql = require("graphql-tag");
const client = require("./client");
const file = new Blob(["Foo."], { type: "text/plain" });
file.name = "bar.txt";
client.mutate({
mutation: gql`
mutation($file: Upload!) {
uploadFile(file: $file) {
success
}
}
`,
variables: { file }
});
Support
Consider polyfilling:
API
Table of contents