ImageUpload é um componente especializado para upload de imagens com preview em tempo real, drag and drop e validação automática. Ideal para avatares, fotos de perfil, imagens de produtos e qualquer cenário que requeira upload visual de imagens.tsx
import { ImageUpload } from "@arkyn/components";
Ou arraste e solte a imagem aqui
tsx
<ImageUploadname="avatar"action="/api/upload/image"label="Selecione uma imagem"/>
tsx
<ImageUploadname="profilePicture"action="/api/upload/avatar"label="Foto de Perfil"showAsteriskdefaultValue={user.avatarUrl}selectImageButtonText="Escolher Foto"changeImageButtonText="Trocar Foto"dropImageText="Arraste sua foto aqui"onChange={(url) => updateUserAvatar(url)}/>
Arraste imagem JPG ou PNG aqui
Arraste logo PNG ou SVG aqui
tsx
{/* Upload de produto com formatos específicos */}<ImageUploadname="productImage"action="/api/upload/product"label="Imagem do Produto"acceptImage=".jpg,.jpeg,.png,.webp"selectImageButtonText="Selecionar Produto"dropImageText="Arraste imagem do produto aqui (JPG, PNG, WebP)"onChange={(url) => setProductImage(url)}/>;{/* Logo com formatos vetoriais */}<ImageUploadname="companyLogo"action="/api/upload/logo"label="Logo da Empresa"acceptImage=".png,.svg,.jpg"selectImageButtonText="Escolher Logo"dropImageText="Arraste logo aqui (PNG, SVG, JPG)"/>;{/* Avatar com alta qualidade */}<ImageUploadname="highResAvatar"action="/api/upload/avatar"label="Avatar Alta Resolução"acceptImage="image/jpeg,image/png"selectImageButtonText="Selecionar Avatar"dropImageText="Arraste avatar em alta resolução"/>;
Solte a imagem aqui para envio
tsx
<ImageUploadname="galleryImage"action="/api/gallery/upload"method="PUT"fileName="galleryImage"fileResponseName="downloadUrl"label="Imagem da Galeria"selectImageButtonText="Adicionar à Galeria"changeImageButtonText="Trocar Imagem"dropImageText="Arraste imagem para galeria"onChange={(url) => {if (url) {addToGallery(url);console.log("Image added to gallery:", url);}}}/>
tsx
<ImageUploadname="readonlyImage"action="/api/upload"label="Imagem do Sistema"defaultValue={systemImage.url}disabled/>
tsx
function ImageUploadWithCallback() {const [uploadStatus, setUploadStatus] = useState({loading: false,error: "",imageUrl: "",});const handleImageUpload = (url?: string) => {if (url) {setUploadStatus({loading: false,error: "",imageUrl: url,});// Processar imagem uploadedprocessUploadedImage(url);// Atualizar estado da aplicaçãoupdateAppState({ profileImage: url });}};return (<ImageUploadname="profileImage"action="/api/upload/profile"label="Foto de Perfil"showAsteriskonChange={handleImageUpload}selectImageButtonText="Escolher Foto"dropImageText="Arraste sua foto de perfil aqui"/>);}
json
// Sucesso (configuração padrão){"url": "https://example.com/uploads/image123.jpg"}// Sucesso (configuração customizada){"imageUrl": "https://example.com/images/avatar.png","thumbnailUrl": "https://example.com/images/avatar_thumb.png","fileName": "avatar.png","size": 1024000}// Erro{"error": "Arquivo muito grande. Máximo permitido: 5MB para imagens"}
javascript
// server.jsconst multer = require("multer");const sharp = require("sharp"); // Para processamento de imagemconst upload = multer({dest: "uploads/",fileFilter: (req, file, cb) => {// Validar tipos de imagemif (file.mimetype.startsWith("image/")) {cb(null, true);} else {cb(new Error("Apenas arquivos de imagem são permitidos"));}},limits: {fileSize: 10 * 1024 * 1024, // 10MB},});app.post("/api/upload/image", upload.single("file"), async (req, res) => {try {if (!req.file) {return res.status(400).json({error: "Nenhuma imagem foi enviada",});}// Validações de imagemconst allowedTypes = ["image/jpeg", "image/png", "image/webp"];if (!allowedTypes.includes(req.file.mimetype)) {return res.status(400).json({error: "Formato não suportado. Use JPEG, PNG ou WebP",});}// Processamento da imagem (opcional)const processedImageBuffer = await sharp(req.file.path).resize(800, 600, { fit: "inside", withoutEnlargement: true }).jpeg({ quality: 85 }).toBuffer();// Upload para storage (S3, CloudFront, etc.)const imageUrl = await uploadToStorage(processedImageBuffer, {filename: `image_${Date.now()}.jpg`,contentType: "image/jpeg",});res.json({url: imageUrl,originalName: req.file.originalname,size: processedImageBuffer.length,});} catch (error) {console.error("Upload error:", error);res.status(500).json({error: "Erro ao processar imagem",});}});
name - string (obrigatório)
Nome do campo para manipulação de formulárioaction - string (obrigatório)
URL do endpoint onde a imagem será enviadadefaultValue - string | null
URL da imagem inicial para exibição como previewdisabled - boolean (padrão: false)
Se o upload de imagem está desabilitadolabel - string
Texto do label a ser exibido acima da área de uploadshowAsterisk - boolean (padrão: false)
Se deve exibir asterisco no label para campos obrigatórioschangeImageButtonText - string (padrão: "Alterar imagem")
Texto do botão para trocar/substituir uma imagem já enviadaselectImageButtonText - string (padrão: "Selecionar imagem")
Texto do botão para selecionar uma imagemdropImageText - string (padrão: "Ou arraste e solte a imagem aqui")
Texto exibido na área de drop zonemethod - string (padrão: "POST")
Método HTTP para a requisição de uploadfileName - string (padrão: "file")
Nome do campo no FormData para o arquivo de imagemfileResponseName - string (padrão: "url")
Nome da propriedade no objeto de resposta que contém a URL da imagemacceptImage - string (padrão: "image/*")
Tipos de imagem aceitos pelo input (ex: "image/*", ".jpg,.png")onChange - (url?: string) => void
Função callback chamada quando o upload é concluído com sucesso