tangning 1 rok temu
rodzic
commit
cb926beb8e
1 zmienionych plików z 65 dodań i 13 usunięć
  1. 65 13
      src/utils/http/axios/Axios.ts

+ 65 - 13
src/utils/http/axios/Axios.ts

@@ -118,15 +118,15 @@ export class VAxios {
    * @description:  File Upload
    */
   uploadFile<T = any>(config: AxiosRequestConfig, params: UploadFileParams) {
+    let conf: CreateAxiosOptions = cloneDeep(config);
     const formData = new window.FormData();
     const customFilename = params.name || 'file';
-
     if (params.filename) {
       formData.append(customFilename, params.file, params.filename);
     } else {
-      formData.append(customFilename, params.file);
+      const file = params.file.originFileObj || params.file;
+      formData.append(customFilename, file || (params.data && params.data.file));
     }
-
     if (params.data) {
       Object.keys(params.data).forEach((key) => {
         const value = params.data![key];
@@ -140,16 +140,68 @@ export class VAxios {
         formData.append(key, params.data![key]);
       });
     }
-
-    return this.axiosInstance.request<T>({
-      ...config,
-      method: 'POST',
-      data: formData,
-      headers: {
-        'Content-type': ContentTypeEnum.FORM_DATA,
-        // @ts-ignore
-        ignoreCancelToken: true,
-      },
+    if (params.data) {
+      Object.keys(params.data).forEach((key) => {
+        const value = params.data![key];
+        if (key == 'file' && !params.filename) {
+          return;
+        }
+        if (Array.isArray(value)) {
+          value.forEach((item) => {
+            formData.append(`${key}[]`, item);
+          });
+          return;
+        }
+        if (params.data![key] == undefined) {
+          formData.append(key, '');
+          return;
+        }
+        formData.append(key, params.data![key]);
+      });
+    }
+    const transform = this.getTransform();
+    const { requestOptions } = this.options;
+    const opt: RequestOptions = Object.assign({}, requestOptions);
+    const { beforeRequestHook, requestCatchHook, transformRequestHook } = transform || {};
+    if (beforeRequestHook && isFunction(beforeRequestHook)) {
+      conf = beforeRequestHook(conf, opt);
+    }
+    conf = this.supportFormData(conf);
+    return new Promise((resolve, reject) => {
+      this.axiosInstance
+        .request<any, AxiosResponse<Result>>({
+          ...conf,
+          method: 'POST',
+          data: formData,
+          requestOptions,
+          headers: {
+            'Content-type': ContentTypeEnum.FORM_DATA,
+            // @ts-ignore
+            ignoreCancelToken: true,
+          },
+        })
+        .then((res: AxiosResponse<Result>) => {
+          if (transformRequestHook && isFunction(transformRequestHook)) {
+            try {
+              const ret = transformRequestHook(res, opt);
+              resolve(ret);
+            } catch (err) {
+              reject(err || new Error('request error!'));
+            }
+            return;
+          }
+          resolve(res as unknown as Promise<T>);
+        })
+        .catch((e: Error | AxiosError) => {
+          if (requestCatchHook && isFunction(requestCatchHook)) {
+            reject(requestCatchHook(e, opt));
+            return;
+          }
+          if (axios.isAxiosError(e)) {
+            // rewrite error message from axios in here
+          }
+          reject(e);
+        });
     });
   }