@@ -31,10 +31,10 @@ class AjaxUploader extends Component<UploadProps> {
3131
3232 private _isMounted : boolean ;
3333
34- private getFilterFn = ( ) => {
34+ private filterFile = ( file : RcFile | File , force = false ) => {
3535 const { accept, directory } = this . props ;
3636
37- let filterFn : AcceptConfig [ 'filter' ] ;
37+ let filterFn : Exclude < AcceptConfig [ 'filter' ] , 'native' > ;
3838 let acceptFormat : string | undefined ;
3939
4040 if ( typeof accept === 'string' ) {
@@ -50,15 +50,17 @@ class AjaxUploader extends Component<UploadProps> {
5050 }
5151 }
5252
53- return filterFn || ( directory ? ( file : RcFile ) => attrAccept ( file , acceptFormat ) : ( ) => true ) ;
53+ const mergedFilter =
54+ filterFn ||
55+ ( directory || force
56+ ? ( currentFile : RcFile ) => attrAccept ( currentFile , acceptFormat )
57+ : ( ) => true ) ;
58+ return mergedFilter ( file as RcFile ) ;
5459 } ;
5560
5661 onChange = ( e : React . ChangeEvent < HTMLInputElement > ) => {
57- const { accept, directory } = this . props ;
5862 const { files } = e . target ;
59- const acceptedFiles = [ ...files ] . filter (
60- ( file : RcFile ) => ! directory || attrAccept ( file , accept ) ,
61- ) ;
63+ const acceptedFiles = [ ...files ] . filter ( file => this . filterFile ( file ) ) ;
6264 this . uploadFiles ( acceptedFiles ) ;
6365 this . reset ( ) ;
6466 } ;
@@ -90,7 +92,7 @@ class AjaxUploader extends Component<UploadProps> {
9092 } ;
9193
9294 onDataTransferFiles = async ( dataTransfer : DataTransfer , existFileCallback ?: ( ) => void ) => {
93- const { multiple, accept , directory } = this . props ;
95+ const { multiple, directory } = this . props ;
9496
9597 const items : DataTransferItem [ ] = [ ...( dataTransfer . items || [ ] ) ] ;
9698 let files : File [ ] = [ ...( dataTransfer . files || [ ] ) ] ;
@@ -100,12 +102,10 @@ class AjaxUploader extends Component<UploadProps> {
100102 }
101103
102104 if ( directory ) {
103- files = await traverseFileTree ( Array . prototype . slice . call ( items ) , ( _file : RcFile ) =>
104- attrAccept ( _file , this . props . accept ) ,
105- ) ;
105+ files = await traverseFileTree ( Array . prototype . slice . call ( items ) , this . filterFile ) ;
106106 this . uploadFiles ( files ) ;
107107 } else {
108- let acceptFiles = [ ...files ] . filter ( ( file : RcFile ) => attrAccept ( file , accept ) ) ;
108+ let acceptFiles = [ ...files ] . filter ( file => this . filterFile ( file , true ) ) ;
109109
110110 if ( multiple === false ) {
111111 acceptFiles = files . slice ( 0 , 1 ) ;
@@ -351,6 +351,9 @@ class AjaxUploader extends Component<UploadProps> {
351351 hasControlInside,
352352 ...otherProps
353353 } = this . props ;
354+
355+ // Extract accept format for input element
356+ const acceptFormat = typeof accept === 'string' ? accept : accept ?. format ;
354357 const cls = clsx ( prefixCls , { [ `${ prefixCls } -disabled` ] : disabled , [ className ] : className } ) ;
355358 // because input don't have directory/webkitdirectory type declaration
356359 const dirProps : any = directory
@@ -384,7 +387,7 @@ class AjaxUploader extends Component<UploadProps> {
384387 key = { this . state . uid }
385388 style = { { display : 'none' , ...styles . input } }
386389 className = { classNames . input }
387- accept = { accept }
390+ accept = { acceptFormat }
388391 { ...dirProps }
389392 multiple = { multiple }
390393 onChange = { this . onChange }
0 commit comments