【问题标题】:how to upload image in react-admin graphql如何在 react-admin graphql 中上传图片
【发布时间】:2018-12-23 07:22:24
【问题描述】:

我在 react-admin 文档中看到了处理图像上传并将其转换为 Base64 的示例数据提供程序,但我不能将其用于 graphql 数据提供程序,任何人都可以帮助我吗?实际上我想要一段在 react-admin graphql dataprovider 中处理图像上传的代码

【问题讨论】:

    标签: graphql image-upload react-admin


    【解决方案1】:

    您必须创建另一个客户端来将图像(或文件)转换为 base64 并将您的 graphQL 客户端包装在它周围。喜欢这个:

    upload.js

    import { CREATE, UPDATE } from 'react-admin'
    
    /**
     * Convert a `File` object returned by the upload input into a base 64 string.
     * That's not the most optimized way to store images in production, but it's
     * enough to illustrate the idea of data provider decoration.
     */
    const convertFileToBase64 = file =>
      new Promise((resolve, reject) => {
        const reader = new FileReader()
        reader.readAsDataURL(file.rawFile)
    
        reader.onload = () => resolve(reader.result)
        reader.onerror = reject
      })
    
    export default dataProvider => (fetchType, resource, params) => {
      if (resource === 'Photo' && (fetchType === CREATE || fetchType === UPDATE)) {
        const { data, ...rest_params } = params
        return convertFileToBase64(data.data).then(base64 => {
          return dataProvider(fetchType, resource, {
            ...rest_params,
            data: { ...data, data: base64 }
          })
        })
      }
      return dataProvider(fetchType, resource, params)
    }
    

    data.js

    import buildGraphQLProvider, { buildQuery } from 'ra-data-graphql-simple'
    import { createHttpLink } from 'apollo-link-http'
    import { ApolloLink } from 'apollo-link'
    import { onError } from 'apollo-link-error'
    import { AUTH_KEY } from '../authentication'
    import { data } from '../schema'
    
    const customBuildQuery = introspection => (fetchType, resource, params) => {
      return buildQuery(introspection)(fetchType, resource, params)
    }
    
    const httpLink = createHttpLink({ uri: process.env.REACT_APP_GRAPHQL_URI })
    const middlewareLink = new ApolloLink((operation, forward) => {
      operation.setContext({
        headers: {
          Authorization: `Bearer ${localStorage.getItem(AUTH_KEY)}` || null
        }
      })
      return forward(operation)
    })
    const errorLink = onError(({ networkError }) => {
      if (networkError.statusCode === 401) {
        // logout();
      }
    })
    const link = middlewareLink.concat(httpLink, errorLink)
    
    export default () =>
      buildGraphQLProvider({
        clientOptions: {
          link: link
        },
        introspection: { schema: data.__schema },
        buildQuery: customBuildQuery
      })
    

    App.js

    import React, { Component } from 'react'
    import { Admin, Resource } from 'react-admin'
    
    import buildGraphQLProvider from 'data'
    import addUploadCapabilities from 'upload'
    import dashboard from 'dashboard'
    import User from 'resources/User'
    import Event from 'resources/Event'
    import Photo from 'resources/Photo'
    
    class App extends Component {
      state = { dataProvider: null }
    
      componentDidMount () {
        buildGraphQLProvider().then(dataProvider => this.setState({ dataProvider }))
      }
    
      render () {
        const { dataProvider } = this.state
    
        if (!dataProvider) {
          return (
            <div className='loader-container'>
              <div className='loader'>Loading...</div>
            </div>
          )
        }
        return (
          <Admin
            dashboard={dashboard}
            title='Admin'
            dataProvider={addUploadCapabilities(dataProvider)}
          >
            <Resource name='User' {...User} />
            <Resource name='Event' {...Event} />
            <Resource name='Photo' {...Photo} />
          </Admin>
        )
      }
    }
    
    export default App
    

    【讨论】:

      猜你喜欢
      • 2018-11-29
      • 2012-05-28
      • 2017-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多