diff --git a/.changeset/poor-eggs-enjoy.md b/.changeset/poor-eggs-enjoy.md
new file mode 100644
index 0000000000..2ca830a1de
--- /dev/null
+++ b/.changeset/poor-eggs-enjoy.md
@@ -0,0 +1,5 @@
+---
+'svelte': patch
+---
+
+fix: add missing files binding
diff --git a/packages/svelte/src/compiler/phases/2-analyze/validation.js b/packages/svelte/src/compiler/phases/2-analyze/validation.js
index f04fe2fbf1..7d421cd07e 100644
--- a/packages/svelte/src/compiler/phases/2-analyze/validation.js
+++ b/packages/svelte/src/compiler/phases/2-analyze/validation.js
@@ -325,6 +325,10 @@ export const validation = {
if (node.name === 'checked' && type?.value[0].data !== 'checkbox') {
error(node, 'invalid-binding', node.name, '');
}
+
+ if (node.name === 'files' && type?.value[0].data !== 'file') {
+ error(node, 'invalid-binding', node.name, '');
+ }
}
if (parent.name === 'select') {
diff --git a/packages/svelte/src/compiler/phases/bindings.js b/packages/svelte/src/compiler/phases/bindings.js
index 17a5ec3b61..2f891827cc 100644
--- a/packages/svelte/src/compiler/phases/bindings.js
+++ b/packages/svelte/src/compiler/phases/bindings.js
@@ -179,5 +179,10 @@ export const binding_properties = {
},
value: {
valid_elements: ['input', 'textarea', 'select']
+ },
+ files: {
+ event: 'change',
+ valid_elements: ['input'],
+ omit_in_ssr: true
}
};