$ok, 'message' => $message, 'path' => $path], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); exit; } $raw = file_get_contents('php://input'); $data = json_decode($raw, true); $url = $data['url'] ?? ''; if (!$url || !filter_var($url, FILTER_VALIDATE_URL)) { respond(false, 'URL无效'); } $scheme = parse_url($url, PHP_URL_SCHEME); if (!in_array(strtolower($scheme), ['http','https'])) { respond(false, '仅支持http/https图片地址'); } $avatarsRoot = __DIR__ . '/../avatars'; if (!is_dir($avatarsRoot)) { @mkdir($avatarsRoot, 0777, true); } $today = (new DateTime('now'))->format('Y-m-d'); $targetDir = $avatarsRoot . '/' . $today; if (!is_dir($targetDir)) { @mkdir($targetDir, 0777, true); } // 推断扩展名 $pathExt = strtolower(pathinfo(parse_url($url, PHP_URL_PATH) ?? '', PATHINFO_EXTENSION)); $allowed = ['jpg','jpeg','png','gif','webp']; if (!$pathExt || !in_array($pathExt, $allowed)) { $pathExt = 'jpg'; } // 使用URL的basename作为文件名,若没有则用hash $basename = basename(parse_url($url, PHP_URL_PATH) ?: ''); if (!$basename || $basename === '/' || $basename === '\\') { $basename = md5($url) . '.' . $pathExt; } if (strpos($basename, '.') === false) { $basename .= '.' . $pathExt; } $safeName = preg_replace('/[^\w\.-]+/u', '_', $basename); $targetPath = $targetDir . '/' . $safeName; // 如果已存在,跳过下载 if (file_exists($targetPath)) { respond(true, '文件已存在,跳过下载', str_replace($_SERVER['DOCUMENT_ROOT'], '', $targetPath)); } // 下载保存 try { $read = @fopen($url, 'rb'); if (!$read) { respond(false, '无法读取远程图片'); } $write = @fopen($targetPath, 'wb'); if (!$write) { respond(false, '无法写入文件'); } stream_copy_to_stream($read, $write); fclose($read); fclose($write); } catch (Throwable $e) { respond(false, '保存失败: ' . $e->getMessage()); } respond(true, '保存成功', str_replace($_SERVER['DOCUMENT_ROOT'], '', $targetPath));