import axios from 'axios'; import { FileDesc } from './FileList'; import message from 'components/message'; import { getDescendantProp } from 'utils'; const instance = axios.create(); export function uploadFiles( files: FileDesc[], url: string, name: string, dispatch: any, uploadedFiles: any, additionalData: any, propertyPath: string, callback: any ) { let result: any = []; dispatch({ files: [...uploadedFiles, ...files] }); const all = files.map((f, index) => { const data = new FormData(); Object.entries(additionalData).forEach(([key, value]) => data.append(key, value as any)); data.append(name, f.file); const current = files[index]; const source = axios.CancelToken.source(); result[index] = source; return instance({ url, method: 'post', cancelToken: source.token, data, onUploadProgress: e => { if (e.lengthComputable) { current.progress = (e.loaded / e.total) * 100; dispatch({ files: [...uploadedFiles, ...files] }); } }, }) .then(({ data }) => { current.isLoading = false; current.isError = false; current.data = getDescendantProp(data, propertyPath); dispatch({ files: [...uploadedFiles, ...files] }); }) .catch(err => { current.isError = true; current.isLoading = false; if (err.message === '取消上传') { current.isError = false; files.splice(index, 1); } message.error(('上传失败 ' + err && err.message) || ''); dispatch({ files: [...uploadedFiles, ...files] }); throw index; }); }); Promise.all(all) .then(() => { callback([...uploadedFiles, ...files]); }) .catch((...args) => { //args.reverse().forEach(a => files.splice(a, 1)); callback([...uploadedFiles, ...files]); }); return result; }