From 6ce73945d3848e69e011c5d5f391adbae85ffda1 Mon Sep 17 00:00:00 2001 From: linxianxi <904492381@qq.com> Date: Mon, 28 Jul 2025 14:33:52 +0800 Subject: [PATCH 1/2] feat: support folder and deprecated directory --- src/AjaxUploader.tsx | 12 +++++++++--- src/interface.tsx | 2 ++ 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/AjaxUploader.tsx b/src/AjaxUploader.tsx index 0de6c29f..ab484722 100644 --- a/src/AjaxUploader.tsx +++ b/src/AjaxUploader.tsx @@ -1,6 +1,7 @@ /* eslint react/no-is-mounted:0,react/sort-comp:0,react/prop-types:0 */ import clsx from 'classnames'; import pickAttrs from 'rc-util/lib/pickAttrs'; +import warning from 'rc-util/lib/warning'; import React, { Component } from 'react'; import attrAccept from './attr-accept'; import type { @@ -321,21 +322,26 @@ class AjaxUploader extends Component { capture, children, directory, + folder, openFileDialogOnClick, onMouseEnter, onMouseLeave, hasControlInside, ...otherProps } = this.props; + + warning( + !('directory' in this.props), + 'directory will be deprecated, please use folder. folder will not filter files other than accept, just like the native method.', + ); const cls = clsx({ [prefixCls]: true, [`${prefixCls}-disabled`]: disabled, [className]: className, }); // because input don't have directory/webkitdirectory type declaration - const dirProps: any = directory - ? { directory: 'directory', webkitdirectory: 'webkitdirectory' } - : {}; + const dirProps: any = + directory || folder ? { directory: 'directory', webkitdirectory: 'webkitdirectory' } : {}; const events = disabled ? {} : { diff --git a/src/interface.tsx b/src/interface.tsx index 2f182ffd..528c083a 100644 --- a/src/interface.tsx +++ b/src/interface.tsx @@ -13,7 +13,9 @@ export interface UploadProps component?: React.ComponentType | string; action?: Action; method?: UploadRequestMethod; + /** @deprecated Please use `folder` instead */ directory?: boolean; + folder?: boolean; data?: Record | ((file: RcFile | string | Blob) => Record); headers?: UploadRequestHeader; accept?: string; From 4b02e9d77e16840f30f6700b02d3ea8750913b8d Mon Sep 17 00:00:00 2001 From: linxianxi <904492381@qq.com> Date: Mon, 28 Jul 2025 14:48:19 +0800 Subject: [PATCH 2/2] test: add test case --- src/AjaxUploader.tsx | 6 ------ tests/uploader.spec.tsx | 12 ++++++++++++ 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/AjaxUploader.tsx b/src/AjaxUploader.tsx index ab484722..01fee9ad 100644 --- a/src/AjaxUploader.tsx +++ b/src/AjaxUploader.tsx @@ -1,7 +1,6 @@ /* eslint react/no-is-mounted:0,react/sort-comp:0,react/prop-types:0 */ import clsx from 'classnames'; import pickAttrs from 'rc-util/lib/pickAttrs'; -import warning from 'rc-util/lib/warning'; import React, { Component } from 'react'; import attrAccept from './attr-accept'; import type { @@ -329,11 +328,6 @@ class AjaxUploader extends Component { hasControlInside, ...otherProps } = this.props; - - warning( - !('directory' in this.props), - 'directory will be deprecated, please use folder. folder will not filter files other than accept, just like the native method.', - ); const cls = clsx({ [prefixCls]: true, [`${prefixCls}-disabled`]: disabled, diff --git a/tests/uploader.spec.tsx b/tests/uploader.spec.tsx index 44a4771b..229116eb 100644 --- a/tests/uploader.spec.tsx +++ b/tests/uploader.spec.tsx @@ -1038,6 +1038,18 @@ describe('uploader', () => { directory: false, }, ); + + it('should trigger beforeUpload when uploading non-accepted files in folder mode', () => { + const beforeUpload = jest.fn(); + const { container } = render(); + + fireEvent.change(container.querySelector('input')!, { + target: { + files: [new File([], 'bamboo.png'), new File([], 'light.jpg')], + }, + }); + expect(beforeUpload).toHaveBeenCalledTimes(2); + }); }); describe('transform file before request', () => {