diff --git a/.changeset/soft-geese-learn.md b/.changeset/soft-geese-learn.md
new file mode 100644
index 000000000000..15216a3b0928
--- /dev/null
+++ b/.changeset/soft-geese-learn.md
@@ -0,0 +1,5 @@
+---
+'svelte': patch
+---
+
+fix: allow setting files binding for ``
diff --git a/packages/svelte/src/compiler/phases/bindings.js b/packages/svelte/src/compiler/phases/bindings.js
index 2f891827ccb0..d8f04e173276 100644
--- a/packages/svelte/src/compiler/phases/bindings.js
+++ b/packages/svelte/src/compiler/phases/bindings.js
@@ -182,6 +182,7 @@ export const binding_properties = {
},
files: {
event: 'change',
+ type: 'set',
valid_elements: ['input'],
omit_in_ssr: true
}
diff --git a/packages/svelte/tests/runtime-browser/samples/binding-files/_config.js b/packages/svelte/tests/runtime-browser/samples/binding-files/_config.js
new file mode 100644
index 000000000000..9103dbb639c7
--- /dev/null
+++ b/packages/svelte/tests/runtime-browser/samples/binding-files/_config.js
@@ -0,0 +1,12 @@
+import { test } from '../../assert';
+
+export default test({
+ async test({ assert, window }) {
+ const input = window.document.querySelector('input');
+ await new Promise((r) => setTimeout(r, 100));
+ assert.equal(input?.files?.length, 1);
+ window.document.querySelector('button')?.click();
+ await new Promise((r) => setTimeout(r, 100));
+ assert.equal(input?.files?.length, 0);
+ }
+});
diff --git a/packages/svelte/tests/runtime-browser/samples/binding-files/main.svelte b/packages/svelte/tests/runtime-browser/samples/binding-files/main.svelte
new file mode 100644
index 000000000000..0e80e5a13da9
--- /dev/null
+++ b/packages/svelte/tests/runtime-browser/samples/binding-files/main.svelte
@@ -0,0 +1,16 @@
+
+
+
+
+