反应管理员 | 无法使用 FileInput 上传文件

oz1*_*z19 3 admin-on-rest react-admin

第一次使用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>
);
Run Code Online (Sandbox Code Playgroud)

问题:

  1. 如何捕获 .csv 文件?

提前致谢!

oz1*_*z19 5

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

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

文档

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;
Run Code Online (Sandbox Code Playgroud)

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

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