Przeglądaj źródła

Upload: fix Error when `beforeUpload` hook return promise of file object (#11297)

* Upload: fix beforeUpload hook bug

* Upload: add ElUploadInternalRawFile interface
陈润山 7 lat temu
rodzic
commit
2a1a6360ca
2 zmienionych plików z 16 dodań i 4 usunięć
  1. 10 2
      packages/upload/src/upload.vue
  2. 6 2
      types/upload.d.ts

+ 10 - 2
packages/upload/src/upload.vue

@@ -94,8 +94,16 @@ export default {
           const fileType = Object.prototype.toString.call(processedFile);
 
           if (fileType === '[object File]' || fileType === '[object Blob]') {
-            processedFile.name = rawFile.name;
-            processedFile.uid = rawFile.uid;
+            if (fileType === '[object Blob]') {
+              processedFile = new File([processedFile], rawFile.name, {
+                type: rawFile.type
+              });
+            }
+            for (const p in rawFile) {
+              if (rawFile.hasOwnProperty(p)) {
+                processedFile[p] = rawFile[p];
+              }
+            }
             this.post(processedFile);
           } else {
             this.post(rawFile);

+ 6 - 2
types/upload.d.ts

@@ -9,13 +9,17 @@ export interface FileListItem {
   status?: FileUploadStatus
 }
 
+export interface ElUploadInternalRawFile extends File {
+  uid: number
+}
+
 export interface ElUploadInternalFileDetail {
   status: FileUploadStatus,
   name: string,
   size: number,
   percentage: number,
   uid: number,
-  raw: File,
+  raw: ElUploadInternalRawFile,
   url?: string
 }
 
@@ -83,7 +87,7 @@ export declare class ElUpload extends ElementUIComponent {
   onChange: (file: ElUploadInternalFileDetail, fileList: ElUploadInternalFileDetail[]) => void
 
   /** Hook function before uploading with the file to be uploaded as its parameter. If false or a Promise is returned, uploading will be aborted */
-  beforeUpload: (file: ElUploadInternalFileDetail) => boolean | Promise<File | boolean>
+  beforeUpload: (file: ElUploadInternalRawFile) => boolean | Promise<File | Blob | boolean>
 
   /** Whether thumbnail is displayed */
   thumbnailMode: boolean