React-Admin |Невозможно загрузить файл с помощью FileInput - PullRequest
1 голос
/ 20 марта 2019

Первый раз с 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?

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

Ответы [ 3 ]

0 голосов
/ 22 марта 2019

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

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

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

сохранить: функция вызывается при отправке формы.Это автоматически передается реагирующим администратором, когда компонент формы используется внутри компонентов «Создание и редактирование».

Вторая проблема: В моем случае я загружаю по одному файлу за раз (несколько= {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' && 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.

Надеюсь, это пригодится кому-нибудь в будущем;)

0 голосов
/ 19 июля 2019

У меня похожая проблема, я не могу загрузить файл, и проблема будет в accept prop.

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

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

Вместо:

<FileInput source="csvFile" label="Upload file (.csv)" accept="text/csv" >
0 голосов
/ 22 марта 2019

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...