diff --git a/docs/en-US/component/upload.md b/docs/en-US/component/upload.md index d04625bd25..00104658b3 100644 --- a/docs/en-US/component/upload.md +++ b/docs/en-US/component/upload.md @@ -175,6 +175,7 @@ interface UploadProgressEvent extends ProgressEvent { interface UploadRawFile extends File { uid: number + isDirectory?: boolean } interface UploadRequestOptions { diff --git a/packages/components/upload/src/upload-dragger.vue b/packages/components/upload/src/upload-dragger.vue index 2dc73f257f..af0b9a106a 100644 --- a/packages/components/upload/src/upload-dragger.vue +++ b/packages/components/upload/src/upload-dragger.vue @@ -17,6 +17,8 @@ import { throwError } from '@element-plus/utils/error' import { uploadContextKey } from './constants' import { uploadDraggerEmits, uploadDraggerProps } from './upload-dragger' +import type { UploadRawFile } from './upload' + const COMPONENT_NAME = 'ElUploadDrag' defineOptions({ @@ -44,7 +46,15 @@ const onDrop = (e: DragEvent) => { e.stopPropagation() - const files = Array.from(e.dataTransfer!.files) + const files = Array.from(e.dataTransfer!.files) as UploadRawFile[] + const items = e.dataTransfer!.items || [] + files.forEach((file, index) => { + const item = items[index] + const entry = item?.webkitGetAsEntry?.() + if (entry) { + file.isDirectory = entry.isDirectory + } + }) emit('file', files) } diff --git a/packages/components/upload/src/upload.ts b/packages/components/upload/src/upload.ts index 65e802eb10..5971d36325 100644 --- a/packages/components/upload/src/upload.ts +++ b/packages/components/upload/src/upload.ts @@ -44,6 +44,7 @@ export type UploadUserFile = Omit & export type UploadFiles = UploadFile[] export interface UploadRawFile extends File { uid: number + isDirectory?: boolean } export type UploadRequestHandler = ( options: UploadRequestOptions