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;
							 |