68 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
			
		
		
	
	
			68 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
| import { request } from "@cqsjjb/jjb-common-lib/http";
 | |
| import { useState } from "react";
 | |
| 
 | |
| /**
 | |
|  * 上传文件 TODO
 | |
|  */
 | |
| function useUploadFile() {
 | |
|   // loading状态
 | |
|   const [loading, setLoading] = useState(false);
 | |
| 
 | |
|   // 上传文件
 | |
|   const uploadFile = (options) => {
 | |
|     setLoading(true);
 | |
| 
 | |
|     return new Promise((resolve, reject) => {
 | |
|       const { files = [], single = true, params = {} } = options;
 | |
|       const formData = new FormData();
 | |
| 
 | |
|       // 将文件添加到formData中
 | |
|       files.forEach((f) => {
 | |
|         f.originFileObj && formData.append("files", f.originFileObj);
 | |
|       });
 | |
| 
 | |
|       // 将额外携带的参数添加到formData中
 | |
|       Object.keys(params).forEach((key) => {
 | |
|         formData.append(key, params[key]);
 | |
|       });
 | |
| 
 | |
|       // 获取待上传的文件
 | |
|       const filesLength = formData.getAll("files").length;
 | |
| 
 | |
|       // 如果没有文件则返回老文件
 | |
|       if (filesLength === 0) {
 | |
|         setLoading(false);
 | |
|         resolve(
 | |
|           single
 | |
|             ? files?.[0]?.url || ""
 | |
|             : { files: files.map(f => f.url), id: "" },
 | |
|         );
 | |
|         return;
 | |
|       }
 | |
| 
 | |
|       // 发送请求
 | |
|       request(single ? "单文件上传的接口" : "多文件上传的接口", "post", formData, { "Content-Type": "multipart/form-data" })
 | |
|         .then((res) => {
 | |
|           resolve(
 | |
|             single
 | |
|               ? res.data.url
 | |
|               : {
 | |
|                   files: [...res.data.files.map(f => f.url), ...files.filter(f => !f.originFileObj).map(f => f.url)],
 | |
|                   id: res.data.id,
 | |
|                 },
 | |
|           );
 | |
|         })
 | |
|         .catch((err) => {
 | |
|           reject(err);
 | |
|         })
 | |
|         .finally(() => {
 | |
|           setLoading(false);
 | |
|         });
 | |
|     });
 | |
|   };
 | |
| 
 | |
|   return [loading, uploadFile];
 | |
| }
 | |
| 
 | |
| export default useUploadFile;
 |