优化应用安装,使用jingrow标准方式上传应用包

This commit is contained in:
jingrow 2025-10-26 16:17:47 +08:00
parent c2056e7042
commit 15ec6a54b0

View File

@ -644,11 +644,9 @@ async def get_app_meta():
@router.post("/jingrow/install-extension") @router.post("/jingrow/install-extension")
async def install_extension_package_api(request: Request, file: UploadFile = File(...)): async def install_extension_package_api(request: Request, file: UploadFile = File(...)):
"""安装扩展包到数据库""" """安装扩展包到数据库"""
temp_file_path = None
try: try:
log_info(f"开始处理上传的扩展包: {file.filename}") log_info(f"开始处理上传的扩展包: {file.filename}")
# 验证文件类型
if not file.filename: if not file.filename:
raise HTTPException(status_code=400, detail="文件名不能为空") raise HTTPException(status_code=400, detail="文件名不能为空")
@ -656,47 +654,28 @@ async def install_extension_package_api(request: Request, file: UploadFile = Fil
if not filename_lower.endswith(('.tar.gz', '.tgz', '.gz')): if not filename_lower.endswith(('.tar.gz', '.tgz', '.gz')):
raise HTTPException(status_code=400, detail=f"只支持TAR.GZ格式的扩展包当前文件: {filename_lower}") 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() content = await file.read()
if not content: if not content:
raise HTTPException(status_code=400, detail="文件内容为空") raise HTTPException(status_code=400, detail="文件内容为空")
temp_file.write(content) log_info(f"读取文件完成,大小: {len(content)} 字节")
temp_file.close()
log_info(f"文件已保存到临时位置: {temp_file_path}, 大小: {len(content)} 字节") # 使用标准文件上传接口
from jingrow.utils.jingrow_api import upload_file_to_jingrow, get_jingrow_api_headers
# 保存文件到 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 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" api_url = f"{Config.jingrow_server_url}/api/action/jingrow.ai.utils.jlocal.install_package"
headers = get_jingrow_api_headers() headers = get_jingrow_api_headers()
file_url = f"/files/{file.filename}"
response = requests.post( response = requests.post(
api_url, api_url,
json={'package_file_url': file_url}, json={'package_file_url': file_url},
@ -722,21 +701,10 @@ async def install_extension_package_api(request: Request, file: UploadFile = Fil
log_error(f"API调用失败: HTTP {response.status_code}") log_error(f"API调用失败: HTTP {response.status_code}")
raise HTTPException(status_code=500, detail=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}")
except HTTPException: except HTTPException:
raise raise
except Exception as e: except Exception as e:
import traceback log_error(f"安装扩展包失败: {str(e)}")
error_detail = traceback.format_exc()
log_error(f"安装扩展包失败: {str(e)}\n{error_detail}")
raise HTTPException(status_code=500, detail=f"安装扩展包失败: {str(e)}") raise HTTPException(status_code=500, detail=f"安装扩展包失败: {str(e)}")