"use client" import type React from "react" import { useState, useRef } from "react" import { Button } from "@/components/ui/button" import { Upload, X } from "lucide-react" import { Progress } from "@/components/ui/progress" interface FileUploaderProps { onFileUploaded: (file: File) => void acceptedTypes?: string maxSize?: number // in MB } export function FileUploader({ onFileUploaded, acceptedTypes = ".pdf,.doc,.docx,.jpg,.jpeg,.png", maxSize = 10, // 10MB default }: FileUploaderProps) { const [dragActive, setDragActive] = useState(false) const [selectedFile, setSelectedFile] = useState(null) const [uploadProgress, setUploadProgress] = useState(0) const [error, setError] = useState(null) const inputRef = useRef(null) const handleDrag = (e: React.DragEvent) => { e.preventDefault() e.stopPropagation() if (e.type === "dragenter" || e.type === "dragover") { setDragActive(true) } else if (e.type === "dragleave") { setDragActive(false) } } const validateFile = (file: File): boolean => { // 检查文件类型 const fileType = file.name.split(".").pop()?.toLowerCase() || "" const isValidType = acceptedTypes.includes(fileType) // 检查文件大小 const isValidSize = file.size <= maxSize * 1024 * 1024 if (!isValidType) { setError(`不支持的文件类型。请上传 ${acceptedTypes} 格式的文件。`) return false } if (!isValidSize) { setError(`文件过大。最大支持 ${maxSize}MB。`) return false } return true } const handleDrop = (e: React.DragEvent) => { e.preventDefault() e.stopPropagation() setDragActive(false) if (e.dataTransfer.files && e.dataTransfer.files[0]) { const file = e.dataTransfer.files[0] handleFile(file) } } const handleChange = (e: React.ChangeEvent) => { e.preventDefault() if (e.target.files && e.target.files[0]) { const file = e.target.files[0] handleFile(file) } } const handleFile = (file: File) => { setError(null) if (validateFile(file)) { setSelectedFile(file) simulateUpload(file) } } const simulateUpload = (file: File) => { // 模拟上传进度 setUploadProgress(0) const interval = setInterval(() => { setUploadProgress((prev) => { if (prev >= 100) { clearInterval(interval) onFileUploaded(file) return 100 } return prev + 10 }) }, 200) } const handleButtonClick = () => { inputRef.current?.click() } const cancelUpload = () => { setSelectedFile(null) setUploadProgress(0) setError(null) } return (
{!selectedFile ? (

拖拽文件到此处,或

支持 {acceptedTypes.replace(/\./g, "")} 格式,最大 {maxSize}MB

) : (
{selectedFile.name}
{uploadProgress}%
)} {error &&
{error}
}
) }