Реагирующий Администратор | Не удается загрузить файл с помощью FileInput

#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>
);
  

Вопрос:

  1. Как я могу получить файл .csv?

Заранее спасибо!

Ответ №1:

После нескольких часов работы над ним я заставил его работать.

Первая проблема (та, которую я прокомментировал в ответе @ selens): я получил Uncaught TypeError: _this.props.save is not a function , потому что я не работал в режиме создания или редактирования. Кажется, вам нужно использовать FileInput в представлениях создания или редактирования. В противном случае кнопка Сохранить не будет работать.

Из документов:

сохранить: функция, вызываемая при отправке формы. Это передается автоматически react-admin, когда компонент form используется внутри компонентов Create и Edit.

Вторая проблема: в моем случае я загружаю по одному файлу за раз (multiple = {false} в FileInput). Однако код 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' amp;amp; 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 prop.

Вы можете использовать следующий код:

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

Вместо:

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

Ответ №3:

Вы проверили разделы DataProvider и UploadFeature в документации? Если у вас есть собственный dataProvider, вы можете создать новый файл addUploadFeature.js и настроить его, как в примере по этой ссылке:

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

Комментарии:

1. Да, но когда я пытаюсь реализовать addUploadFeature.js , я получаю следующую ошибку при нажатии кнопки Сохранить: Uncaught TypeError: _this.props.save is not a function . Есть идеи? Спасибо за ваш ответ, селенс.