| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- //上传封面组件
- import _React, { useState } from "react";
- import { LoadingOutlined, PlusOutlined } from "@ant-design/icons";
- import { message, Upload } from "antd";
- import type { UploadChangeParam } from "antd/es/upload";
- import type { RcFile, UploadFile, UploadProps } from "antd/es/upload/interface";
- const getBase64 = (img: RcFile, callback: (url: string) => void) => {
- const reader = new FileReader();
- reader.addEventListener("load", () => callback(reader.result as string));
- reader.readAsDataURL(img);
- };
- const beforeUpload = (file: RcFile) => {
- const isJpgOrPng = file.type === "image/jpeg" || file.type === "image/png";
- if (!isJpgOrPng) {
- message.error("You can only upload JPG/PNG file!");
- }
- const isLt2M = file.size / 1024 / 1024 < 2;
- if (!isLt2M) {
- message.error("Image must smaller than 2MB!");
- }
- return isJpgOrPng && isLt2M;
- };
- const UploadTextureWidget = () => {
- const [loading, setLoading] = useState(false);
- const [imageUrl, setImageUrl] = useState<string>();
- const handleChange: UploadProps["onChange"] = (
- info: UploadChangeParam<UploadFile>
- ) => {
- if (info.file.status === "uploading") {
- setLoading(true);
- return;
- }
- if (info.file.status === "done") {
- // Get this url from response in real world.
- getBase64(info.file.originFileObj as RcFile, (url) => {
- setLoading(false);
- setImageUrl(url);
- });
- }
- };
- const uploadButton = (
- <div>
- {loading ? <LoadingOutlined /> : <PlusOutlined />}
- <div style={{ marginTop: 8 }}>Upload</div>
- </div>
- );
- return (
- <Upload
- name="avatar"
- listType="picture-card"
- className="avatar-uploader"
- showUploadList={false}
- beforeUpload={beforeUpload}
- onChange={handleChange}
- >
- {imageUrl ? (
- <img src={imageUrl} alt="avatar" style={{ width: "100%" }} />
- ) : (
- uploadButton
- )}
- </Upload>
- );
- };
- export default UploadTextureWidget;
|