diff --git a/apps/jingrow/jingrow/api/local_app_installer.py b/apps/jingrow/jingrow/api/local_app_installer.py index a654d6f..f47b16a 100644 --- a/apps/jingrow/jingrow/api/local_app_installer.py +++ b/apps/jingrow/jingrow/api/local_app_installer.py @@ -644,11 +644,9 @@ async def get_app_meta(): @router.post("/jingrow/install-extension") async def install_extension_package_api(request: Request, file: UploadFile = File(...)): """安装扩展包到数据库""" - temp_file_path = None try: log_info(f"开始处理上传的扩展包: {file.filename}") - # 验证文件类型 if not file.filename: raise HTTPException(status_code=400, detail="文件名不能为空") @@ -656,87 +654,57 @@ async def install_extension_package_api(request: Request, file: UploadFile = Fil if not filename_lower.endswith(('.tar.gz', '.tgz', '.gz')): raise HTTPException(status_code=400, detail=f"只支持TAR.GZ格式的扩展包,当前文件: {filename_lower}") - # 保存上传文件到临时目录 - temp_file = tempfile.NamedTemporaryFile(delete=False, suffix='.tar.gz') - temp_file_path = temp_file.name - try: - content = await file.read() - if not content: - raise HTTPException(status_code=400, detail="文件内容为空") - - temp_file.write(content) - temp_file.close() - - log_info(f"文件已保存到临时位置: {temp_file_path}, 大小: {len(content)} 字节") - - # 保存文件到 jingrow-bench/sites/test001/public/files/ - target_dir = Path('/home/jingrow/jingrow-bench/sites/test001/public/files') - target_dir.mkdir(parents=True, exist_ok=True) - target_path = target_dir / file.filename - - # 复制文件 - shutil.copy2(temp_file_path, target_path) - - # 修复文件权限和所有者 - import pwd - try: - jingrow_user = pwd.getpwnam('jingrow') - os.chown(target_path, jingrow_user.pw_uid, jingrow_user.pw_gid) - os.chmod(target_path, 0o644) - log_info(f"文件权限已修复: owner=jingrow, permissions=644") - except Exception as perm_error: - log_error(f"修复文件权限失败: {perm_error}") - - log_info(f"文件已保存到: {target_path}") - - # 调用 install_package API 安装 - from jingrow.utils.jingrow_api import get_jingrow_api_headers - import requests - - api_url = f"{Config.jingrow_server_url}/api/action/jingrow.ai.utils.jlocal.install_package" - headers = get_jingrow_api_headers() - - file_url = f"/files/{file.filename}" - response = requests.post( - api_url, - json={'package_file_url': file_url}, - headers=headers, - timeout=60 - ) - - if response.status_code == 200: - result_data = response.json() - if result_data.get('message', {}).get('success'): - log_info(f"扩展包安装成功: {result_data['message'].get('package_name')}") - return { - 'success': True, - 'package_name': result_data['message']['package_name'], - 'file_url': file_url, - 'file_count': result_data['message'].get('file_count', 0) - } - else: - error_msg = result_data.get('message', {}).get('error', '未知错误') - log_error(f"安装失败: {error_msg}") - raise HTTPException(status_code=400, detail=error_msg) + content = await file.read() + if not content: + raise HTTPException(status_code=400, detail="文件内容为空") + + log_info(f"读取文件完成,大小: {len(content)} 字节") + + # 使用标准文件上传接口 + from jingrow.utils.jingrow_api import upload_file_to_jingrow, get_jingrow_api_headers + import requests + + upload_result = upload_file_to_jingrow(content, file.filename) + + if not upload_result.get('success'): + raise HTTPException(status_code=400, detail=upload_result.get('error', '文件上传失败')) + + file_url = upload_result['file_url'] + log_info(f"文件上传成功: {file_url}") + + # 调用 install_package API 安装 + api_url = f"{Config.jingrow_server_url}/api/action/jingrow.ai.utils.jlocal.install_package" + headers = get_jingrow_api_headers() + + response = requests.post( + api_url, + json={'package_file_url': file_url}, + headers=headers, + timeout=60 + ) + + if response.status_code == 200: + result_data = response.json() + if result_data.get('message', {}).get('success'): + log_info(f"扩展包安装成功: {result_data['message'].get('package_name')}") + return { + 'success': True, + 'package_name': result_data['message']['package_name'], + 'file_url': file_url, + 'file_count': result_data['message'].get('file_count', 0) + } else: - log_error(f"API调用失败: HTTP {response.status_code}") - raise HTTPException(status_code=500, detail=f'安装API调用失败: HTTP {response.status_code}') - - finally: - # 清理临时文件 - if temp_file_path: - try: - os.unlink(temp_file_path) - log_info(f"临时文件已删除: {temp_file_path}") - except Exception as cleanup_error: - log_error(f"清理临时文件失败: {cleanup_error}") + error_msg = result_data.get('message', {}).get('error', '未知错误') + log_error(f"安装失败: {error_msg}") + raise HTTPException(status_code=400, detail=error_msg) + else: + log_error(f"API调用失败: HTTP {response.status_code}") + raise HTTPException(status_code=500, detail=f'安装API调用失败: HTTP {response.status_code}') except HTTPException: raise except Exception as e: - import traceback - error_detail = traceback.format_exc() - log_error(f"安装扩展包失败: {str(e)}\n{error_detail}") + log_error(f"安装扩展包失败: {str(e)}") raise HTTPException(status_code=500, detail=f"安装扩展包失败: {str(e)}")