【问题标题】:React-Admin | Cannot upload a file using FileInput反应管理员 |无法使用 FileInput 上传文件
【发布时间】:2019-08-11 12:00:12
【问题描述】:

第一次使用 React-Admin。我正在使用它来创建一个面板,该面板基本上监控我从 API 获得的一些参数。但是,有一部分需要上传 .csv 文件。我正在尝试使用 FileInput 来实现它,但我无法捕获该文件。我不明白该怎么做。

文件选择步骤(从电脑到浏览器)工作正常,但我的问题是在该步骤之后我无法处理文件。我阅读了文档,但我不知道该怎么做。我尝试了很多不同的方法,但我快疯了。

以下是基本代码。我想我必须添加一个处理程序或类似的东西,但是,如何?我对 React 也没有什么经验。我知道基础知识,但我只是构建了几个(超级)简单的应用程序。仅供学习。

// UploadFile.js
...

export const UploadSection = props => (
    <SimpleForm>
        <FileInput source="csvFile" label="Upload file (.csv)" accept="text/csv" >
            <FileField source="src" title="title" />
        </FileInput>
    </SimpleForm>
);


// App.js
...

const App = () => (
    <Admin dataProvider={dataProvider} authProvider={authProvider} >
        ...
        <Resource name="uploadSection" list={UploadSection} />
        ...
    </Admin>
);

问题:

  1. 如何捕获 .csv 文件?

提前致谢!

【问题讨论】:

    标签: admin-on-rest react-admin


    【解决方案1】:

    在几个小时的工作之后,我得到了它的工作。

    第一个问题(我评论了@selens 答案的那个):我得到了Uncaught TypeError: _this.props.save is not a function,因为我没有在创建或编辑视图中工作。看来您需要在创建或编辑视图中使用 FileInput。如果没有,保存按钮将不起作用。

    来自docs

    save:提交表单时调用的函数。当在 Create 和 Edit 组件中使用表单组件时,react-admin 会自动传递。

    第二个问题:在我的情况下,我一次上传一个文件(FileInput 中的multiple={false})。但是,代码addUploadFeature.js 可以用于多个文件。所以,我编辑了addUploadFeature.js 的一部分,只上传了一个文件。请参阅下面的完整文件。

    // addUploadFeature.js
    
    const convertFileToBase64 = file => new Promise((resolve, reject) => {
      const reader = new FileReader();
      reader.readAsDataURL(file.rawFile);
    
      reader.onload = () => resolve(reader.result);
      reader.onerror = reject;
    });
    
    const addUploadFeature = requestHandler => (type, resource, params) => {
    
      if (type === 'UPDATE' && resource === 'myResource') {
      
          if (params.data.myFile) {
    
              // NEW CODE HERE (to upload just one file):
              const myFile = params.data.myFile;
              if ( !myFile.rawFile instanceof File ){
                  return Promise.reject('Error: Not a file...'); // Didn't test this...
              }
    
              return Promise.resolve( convertFileToBase64(myFile) )
                  .then( (picture64) => ({
                      src: picture64,
                      title: `${myFile.title}`
                  }))
                  .then( transformedMyFile => requestHandler(type, resource, {
                      ...params,
                      data: {
                          ...params.data,
                          myFile: transformedMyFile
                      }
                  }));
          }
      }
      return requestHandler(type, resource, params);
    };
    
    export default addUploadFeature;
    

    毕竟,我能够将文件以 Base64 格式发送到服务器。

    希望这对将来的某人有用;)

    【讨论】:

      【解决方案2】:

      我有类似的问题,我无法上传文件,问题将在accept 道具中。

      您可以使用以下代码:

      <FileInput source="csvFile" label="Upload file (.csv)" accept=".csv" >
      

      代替:

      <FileInput source="csvFile" label="Upload file (.csv)" accept="text/csv" >
      

      【讨论】:

        【解决方案3】:

        您是否检查过文档中的DataProviderUploadFeature 部分? 如果您有自己的 DataProvider,您可以创建一个新文件 addUploadFeature.js 并按照此链接下的示例对其进行自定义:

        https://marmelab.com/react-admin/DataProviders.html#extending-a-data-provider-example-of-file-upload

        【讨论】:

        • 是的,但是当我尝试实现 addUploadFeature.js 时,单击保存按钮时出现下一个错误:Uncaught TypeError: _this.props.save is not a function。任何想法?谢谢你的回答,selens。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-11
        • 2019-09-12
        • 2017-08-02
        • 1970-01-01
        相关资源
        最近更新 更多