Merge pull request #4952 from cddjr/fix_file_perm

This commit is contained in:
jxxghp
2025-09-16 07:00:45 +08:00
committed by GitHub

View File

@@ -1,3 +1,4 @@
import os
from pathlib import Path
from tempfile import NamedTemporaryFile
from threading import Lock
@@ -21,6 +22,8 @@ from app.utils.string import StringUtils
recognize_lock = Lock()
scraping_lock = Lock()
current_umask = os.umask(0)
os.umask(current_umask)
class MediaChain(ChainBase):
"""
@@ -457,10 +460,9 @@ class MediaChain(ChainBase):
"""
if not _fileitem or not _content or not _path:
return
# 使用tempfile创建临时文件动删除
tmp_file = NamedTemporaryFile(delete=False, suffix=_path.suffix)
tmp_file_path = Path(tmp_file.name)
try:
# 使用tempfile创建临时文件动删除
with NamedTemporaryFile(delete=True, delete_on_close=False, suffix=_path.suffix) as tmp_file:
tmp_file_path = Path(tmp_file.name)
# 写入内容
if isinstance(_content, bytes):
tmp_file.write(_content)
@@ -468,19 +470,16 @@ class MediaChain(ChainBase):
tmp_file.write(_content.encode('utf-8'))
tmp_file.flush()
tmp_file.close() # 关闭文件句柄
# 刮削文件只需要读写权限
tmp_file_path.chmod(0o666 & ~current_umask)
# 上传文件
item = storagechain.upload_file(fileitem=_fileitem, path=tmp_file_path, new_name=_path.name)
if item:
logger.info(f"已保存文件:{item.path}")
else:
logger.warn(f"文件保存失败:{_path}")
finally:
# 手动删除临时文件
try:
tmp_file_path.unlink(missing_ok=True)
except Exception as cleanup_err:
logger.warning(f"清理临时文件失败:{cleanup_err}")
def __download_and_save_image(_fileitem: schemas.FileItem, _path: Path, _url: str):
"""
@@ -496,17 +495,19 @@ class MediaChain(ChainBase):
request_utils = RequestUtils(proxies=settings.PROXY, ua=settings.NORMAL_USER_AGENT)
with request_utils.get_stream(url=_url) as r:
if r and r.status_code == 200:
# 使用tempfile创建临时文件动删除
tmp_file = NamedTemporaryFile(delete=False, suffix=_path.suffix)
tmp_file_path = Path(tmp_file.name)
try:
# 使用tempfile创建临时文件动删除
with NamedTemporaryFile(delete=True, delete_on_close=False, suffix=_path.suffix) as tmp_file:
tmp_file_path = Path(tmp_file.name)
# 流式写入文件
for chunk in r.iter_content(chunk_size=8192):
if chunk:
tmp_file.write(chunk)
tmp_file.flush()
tmp_file.close() # 关闭文件句柄
# 刮削的图片只需要读写权限
tmp_file_path.chmod(0o666 & ~current_umask)
# 上传文件
item = storagechain.upload_file(fileitem=_fileitem, path=tmp_file_path,
new_name=_path.name)
@@ -514,12 +515,6 @@ class MediaChain(ChainBase):
logger.info(f"已保存图片:{item.path}")
else:
logger.warn(f"图片保存失败:{_path}")
finally:
# 手动删除临时文件
try:
tmp_file_path.unlink(missing_ok=True)
except Exception as cleanup_err:
logger.warning(f"清理临时文件失败:{cleanup_err}")
else:
logger.info(f"{_url} 图片下载失败")
except Exception as err: