diff --git a/packages/ra-ui-materialui/src/input/FileInput.stories.tsx b/packages/ra-ui-materialui/src/input/FileInput.stories.tsx
index ba33618b51a..1cb6c68a8de 100644
--- a/packages/ra-ui-materialui/src/input/FileInput.stories.tsx
+++ b/packages/ra-ui-materialui/src/input/FileInput.stories.tsx
@@ -114,6 +114,24 @@ export const CustomRemoveIcon = () => (
);
+export const OnChange = ({ onChange = console.log }) => (
+
+
+
+
+
+
+);
+
+export const OnChangeMultiple = ({ onChange = console.log }) => (
+
+
+
+
+
+
+);
+
const i18nProvider = polyglotI18nProvider(() => englishMessages);
const Wrapper = ({ children }) => (
diff --git a/packages/ra-ui-materialui/src/input/FileInput.tsx b/packages/ra-ui-materialui/src/input/FileInput.tsx
index 74d41265f73..aa7580bcd21 100644
--- a/packages/ra-ui-materialui/src/input/FileInput.tsx
+++ b/packages/ra-ui-materialui/src/input/FileInput.tsx
@@ -40,6 +40,7 @@ export const FileInput = (props: FileInputProps) => {
labelMultiple = 'ra.input.file.upload_several',
labelSingle = 'ra.input.file.upload_single',
options = {},
+ onChange: onChangeProp,
onRemove: onRemoveProp,
parse,
placeholder,
@@ -95,6 +96,7 @@ export const FileInput = (props: FileInputProps) => {
validate,
disabled,
readOnly,
+ onChange: onChangeProp,
...rest,
});
const { error, invalid } = fieldState;