zy-vue-library/hooks/useUploadFile/index.js

42 lines
1.6 KiB
JavaScript
Raw Permalink Normal View History

2025-10-22 11:19:51 +08:00
import { unref } from "vue";
import {uploadRequest} from "../../axios/index.js";
/**
* @description 用于处理单个或多个文件上传传入数组是批量上传传入对象是单个上传
* @param {File|File[]} params - 要上传的文件或文件数组可以是响应式对象
* @param {string|number} type - 文件类型标识
* @param {Object} [api] - 可选的自定义 API 对象
* @param {Function} [api.batch="/img-files/batch"] - 批量上传文件的 API 函数接受 formData 参数
* @param {Function} [api.single="/img-files"] - 单个文件上传的 API 函数接受 formData 参数
* @returns {Promise<File|File[]>} 上传成功后返回包含文件信息的对象或数组传入数组会返回数组传入对象会返回对象
* */
export default async function useUploadFile(
params,
type,
api = {
batch: (formData) => uploadRequest('/img-files/batch', formData),
single: (formData) => uploadRequest('/img-files', formData),
}
) {
const file = unref(params);
const isArray = Array.isArray(file);
const formData = new FormData();
if (isArray) {
file.forEach((f) => {
f.raw && formData.append("files", f.raw);
});
} else {
file.raw && formData.append("files", file.raw);
}
formData.append("type", type);
const filesLength = formData.getAll("files").length;
if (filesLength === 0) return file;
if (isArray) {
const { data } = await api.batch(formData);
return [...data, ...file.filter((f) => !f.raw)];
} else {
const { data } = await api.single(formData);
return data;
}
}