Reactjs中的antd文件上传验证
Antd file upload validation in Reactjs
我正在使用 Antd design 上传文件,这使文件上传正常。
<Upload {...props}>
<Button icon={<UploadOutlined />}>Upload png only</Button>
</Upload>
这里我有一个 beforeUplaod
函数,它的代码如下所示,
const beforeUpload = (file) => {
const isPNG = file.type === "image/png";
if (!isPNG) {
message.error(`${file.name} is not a png file`);
}
// return Upload.LIST_IGNORE; (This will work in newer version but I am using older one which is 4.9.4.
}
正如我在上面的代码中提到的,如果上传的图像不是 png,那么它会在我们使用 Upload.LIST_IGNORE
时从当前列表中删除上传的图像,但不幸的是我正在使用较旧的 版本 4.9.4 并且它没有任何此类关键字可以从列表中删除无效上传。
能否请您帮我从 4.9.4 版列表中删除上传的无效项目?
工作示例:
结果:
经过一些尝试,如果文件无效,我已阻止该文件显示在列表中,但不幸的是,删除上传的文件现在不起作用(在当前实施之前工作正常)。
您可以创建状态并控制文件列表。在新版本中,我们可以使用 Upload.LIST_IGNORE,但看看 API Section
。如果你不想上传文件,你可以简单地 return false 或者如果你使用 promise,你可以用 reject(false)
.
拒绝
查看上传组件 API 部分中的 beforeUpload
。
https://ant.design/components/upload/#API
import { useState } from 'react';
import { Upload, Button, message, UploadProps } from 'antd';
import { UploadOutlined } from '@ant-design/icons';
function App() {
const [fileList, setFileList] = useState([]);
const [mode, setMode] = useState(false);
const uploadProps = {
multiple: mode,
fileList,
beforeUpload: (file, filesArray) => {
let count = 0;
let files = filesArray.filter((file) => {
const isPNG = file.type === 'image/png';
!isPNG && count++;
return isPNG;
});
if (count > 0) {
setFileList([]);
message.error(`${count} Files Not Uploaded. Please Upload PNG File/s`);
return false;
}
// If Mode Is Multiple, Simply Store All Files
if (mode) {
setFileList(files);
} else {
setFileList((prev) => {
let newFiles = [...prev];
newFiles.push(file);
return newFiles;
});
}
return true;
// Using Promise
// return new Promise((resolve, reject) => {
// // If Not PNG, Reject The Promise
// if (!isPNG) return reject(false);
// // Else Set The FileList & Send The File
// setFileList([file]);
// resolve(file);
// });
},
onRemove: (file) => {
setFileList((prev) => prev.filter((f) => f.uid !== file.uid));
}
};
console.log(fileList);
return (
<div style={{ display: 'flex', flexDirection: 'column' }}>
<div style={{ marginBottom: '10px' }}>
<Button type='primary' onClick={() => setMode((prev) => !prev)}>
Toggle Mode
</Button>
</div>
<Upload {...uploadProps}>
<Button icon={<UploadOutlined />}>Upload png only</Button>
</Upload>
</div>
);
}
export default App;
希望这能解决您的问题
我能够通过实施 onRemove
处理程序删除 selected/uploaded 文件。
示例:
const Uploader = () => {
const [fileList, setFileList] = useState<UploadFile[]>([]);
const validateFileType = (
{ type, name }: UploadFile,
allowedTypes?: string
) => {
if (!allowedTypes) {
return true;
}
if (type) {
return allowedTypes.includes(type);
}
};
const uploadProps = useMemo(
() => ({
beforeUpload: (file: UploadFile) => {
const isAllowedType = validateFileType(file, "image/png");
if (!isAllowedType) {
setFileList((state) => [...state]);
message.error(`${file.name} is not PNG file`);
return false;
}
setFileList((state) => [...state, file]);
return false;
},
onRemove: (file: UploadFile) => {
if (fileList.some((item) => item.uid === file.uid)) {
setFileList((fileList) =>
fileList.filter((item) => item.uid !== file.uid)
);
return true;
}
return false;
}
}),
[fileList]
);
return (
<Upload multiple {...uploadProps} fileList={fileList}>
<Button icon={<UploadOutlined />}>Upload png only</Button>
</Upload>
);
};
我正在使用 Antd design 上传文件,这使文件上传正常。
<Upload {...props}>
<Button icon={<UploadOutlined />}>Upload png only</Button>
</Upload>
这里我有一个 beforeUplaod
函数,它的代码如下所示,
const beforeUpload = (file) => {
const isPNG = file.type === "image/png";
if (!isPNG) {
message.error(`${file.name} is not a png file`);
}
// return Upload.LIST_IGNORE; (This will work in newer version but I am using older one which is 4.9.4.
}
正如我在上面的代码中提到的,如果上传的图像不是 png,那么它会在我们使用 Upload.LIST_IGNORE
时从当前列表中删除上传的图像,但不幸的是我正在使用较旧的 版本 4.9.4 并且它没有任何此类关键字可以从列表中删除无效上传。
能否请您帮我从 4.9.4 版列表中删除上传的无效项目?
工作示例:
结果:
经过一些尝试,如果文件无效,我已阻止该文件显示在列表中,但不幸的是,删除上传的文件现在不起作用(在当前实施之前工作正常)。
您可以创建状态并控制文件列表。在新版本中,我们可以使用 Upload.LIST_IGNORE,但看看 API Section
。如果你不想上传文件,你可以简单地 return false 或者如果你使用 promise,你可以用 reject(false)
.
查看上传组件 API 部分中的 beforeUpload
。
https://ant.design/components/upload/#API
import { useState } from 'react';
import { Upload, Button, message, UploadProps } from 'antd';
import { UploadOutlined } from '@ant-design/icons';
function App() {
const [fileList, setFileList] = useState([]);
const [mode, setMode] = useState(false);
const uploadProps = {
multiple: mode,
fileList,
beforeUpload: (file, filesArray) => {
let count = 0;
let files = filesArray.filter((file) => {
const isPNG = file.type === 'image/png';
!isPNG && count++;
return isPNG;
});
if (count > 0) {
setFileList([]);
message.error(`${count} Files Not Uploaded. Please Upload PNG File/s`);
return false;
}
// If Mode Is Multiple, Simply Store All Files
if (mode) {
setFileList(files);
} else {
setFileList((prev) => {
let newFiles = [...prev];
newFiles.push(file);
return newFiles;
});
}
return true;
// Using Promise
// return new Promise((resolve, reject) => {
// // If Not PNG, Reject The Promise
// if (!isPNG) return reject(false);
// // Else Set The FileList & Send The File
// setFileList([file]);
// resolve(file);
// });
},
onRemove: (file) => {
setFileList((prev) => prev.filter((f) => f.uid !== file.uid));
}
};
console.log(fileList);
return (
<div style={{ display: 'flex', flexDirection: 'column' }}>
<div style={{ marginBottom: '10px' }}>
<Button type='primary' onClick={() => setMode((prev) => !prev)}>
Toggle Mode
</Button>
</div>
<Upload {...uploadProps}>
<Button icon={<UploadOutlined />}>Upload png only</Button>
</Upload>
</div>
);
}
export default App;
希望这能解决您的问题
我能够通过实施 onRemove
处理程序删除 selected/uploaded 文件。
示例:
const Uploader = () => {
const [fileList, setFileList] = useState<UploadFile[]>([]);
const validateFileType = (
{ type, name }: UploadFile,
allowedTypes?: string
) => {
if (!allowedTypes) {
return true;
}
if (type) {
return allowedTypes.includes(type);
}
};
const uploadProps = useMemo(
() => ({
beforeUpload: (file: UploadFile) => {
const isAllowedType = validateFileType(file, "image/png");
if (!isAllowedType) {
setFileList((state) => [...state]);
message.error(`${file.name} is not PNG file`);
return false;
}
setFileList((state) => [...state, file]);
return false;
},
onRemove: (file: UploadFile) => {
if (fileList.some((item) => item.uid === file.uid)) {
setFileList((fileList) =>
fileList.filter((item) => item.uid !== file.uid)
);
return true;
}
return false;
}
}),
[fileList]
);
return (
<Upload multiple {...uploadProps} fileList={fileList}>
<Button icon={<UploadOutlined />}>Upload png only</Button>
</Upload>
);
};