| Server IP : 217.154.3.148 / Your IP : 216.73.216.90 Web Server : Apache System : Linux blissful-wright.217-154-3-148.plesk.page 6.8.0-124-generic #124-Ubuntu SMP PREEMPT_DYNAMIC Tue May 26 13:00:45 UTC 2026 x86_64 User : gracious-boyd_hfhh1h8vo9n ( 10000) PHP Version : 8.3.31 Disable Function : opcache_get_status MySQL : OFF | cURL : ON | WGET : OFF | Perl : OFF | Python : OFF | Sudo : OFF | Pkexec : OFF Directory : /var/www/vhosts/gracious-boyd.217-154-3-148.plesk.page/nextjs/pages/api/ |
Upload File : |
import type { NextApiRequest, NextApiResponse } from 'next'
import fs from 'node:fs/promises'
// interne Analyze-URL (Loopback, damit kein Nginx beteiligt ist)
const ANALYZE_URL = process.env.MASK_DEBUG_ANALYZE_URL || 'http://127.0.0.1:3001/nextjs/api/analyze'
// Standard-Testbild (kann via ?img=... übersteuert werden)
const DEFAULT_IMG = process.env.MASK_DEBUG_IMG || '/var/www/vhosts/gracious-boyd.217-154-3-148.plesk.page/testimg/7xm.xyz332401.jpg'
// Standard-Parameter
const MASKW = process.env.MASK_DEBUG_MASKW || '0.70'
const BLUR = process.env.MASK_DEBUG_BLUR || '3.5'
export const config = { api: { bodyParser: false } } // wir bauen selbst Multipart
export default async function handler(req: NextApiRequest, res: NextApiResponse) {
try {
const imgPath = (typeof req.query.img === 'string' && req.query.img) ? req.query.img : DEFAULT_IMG
const maskw = (typeof req.query.maskw === 'string' && req.query.maskw) ? req.query.maskw : MASKW
const blur = (typeof req.query.blur === 'string' && req.query.blur) ? req.query.blur : BLUR
const buf = await fs.readFile(imgPath as string)
// Multipart bauen (Node 18+ hat FormData/Blob)
const fd = new FormData()
const arrayBuffer = buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength) as ArrayBuffer
const blob = new Blob([arrayBuffer], { type: 'image/jpeg' })
fd.append('file', blob, 'test.jpg')
const url = `${ANALYZE_URL}?seg=1&maskw=${encodeURIComponent(maskw)}&maskblur=${encodeURIComponent(blur)}`
const r = await fetch(url, { method: 'POST', body: fd })
if (!r.ok) {
const txt = await r.text()
res.status(502).json({ ok: false, error: `analyze failed: ${r.status}`, body: txt })
return
}
const json = await r.json() as any
const fgMask: string | undefined = json?.fg_mask
if (!fgMask || typeof fgMask !== 'string') {
res.status(500).json({ ok: false, error: 'no fg_mask in response', json })
return
}
// data:image/png;base64,... → reines Base64
const base64 = fgMask.replace(/^data:image\/png;base64,/, '')
const png = Buffer.from(base64, 'base64')
res.setHeader('Content-Type', 'image/png')
res.setHeader('Cache-Control', 'no-store')
res.status(200).send(png)
} catch (e: any) {
res.status(500).json({ ok: false, error: String(e?.message || e) })
}
}