How would you do file uploads in a React-Relay app?

后端 未结 5 1276
时光说笑
时光说笑 2020-12-30 03:45

A file upload seems like a mutation. It\'s often accompanied by other data. But it\'s a big binary blob, so I\'m not sure how GraphQL can deal with it. How would you inte

5条回答
  •  灰色年华
    2020-12-30 03:49

    To add to the other answers, with Relay Modern, there was a small change on how you should send the files from the client. Instead of having a getFiles in your mutation and passing the files to the constructor, you can use something like the following:

    UploadFileMutation.js

    // @flow
    
    import { commitMutation, graphql } from 'react-relay';
    
    import type { Environment } from 'react-relay';
    import type { UploadFileInput, UploadFileMutationResponse } from './__generated__/uploadFileMutation.graphql';
    
    const mutation = graphql`
      mutation UploadFileMutation( $input: UploadFileInput! ) {
        UploadFile(input: $input) {
          error
          file {
            url
          }
        }
      }
    `;
    
    const getOptimisticResponse = (file: File | Blob) => ({
      UploadFile: {
        error: null,
        file: {
          url: file.uri,
        },
      },
    });
    
    function commit(
      environment: Environment,
      { fileName }: UploadFileInput,
      onCompleted: (data: UploadFileMutationResponse) => void,
      onError: () => void,
      uploadables,
    ) {
      return commitMutation(environment, {
        mutation,
        variables: {
          input: { fileName },
        },
        optimisticResponse: getOptimisticResponse(uploadables.fileToUpload),
        onCompleted,
        onError,
        uploadables,
      });
    }
    
    export default { commit };
    

    Usage on component:

    const uploadables = {
      fileToUpload: file, // file is the value of an input field for example
    };
    
    UploadFileMutation.commit(
      this.props.relay.environment,
      { fileName },
      onCompleted,
      onError,
      uploadables
    );
    

    The uploadables config option is kinda of hidden, since there is no mention to it on the docs, but it can be found here: https://github.com/facebook/relay/blob/c4430643002ec409d815366b0721ba88ed3a855a/packages/relay-runtime/mutations/commitRelayModernMutation.js#L32

提交回复
热议问题