fix: save DingTalk downloaded files to media dir instead of /tmp

This commit is contained in:
Meng Yuhang
2026-03-14 23:24:36 +08:00
committed by Xubin Ren
parent 34358eabc9
commit f9ba6197de
2 changed files with 10 additions and 7 deletions

View File

@@ -538,8 +538,8 @@ class DingTalkChannel(BaseChannel):
filename: str, filename: str,
sender_id: str, sender_id: str,
) -> str | None: ) -> str | None:
"""Download a DingTalk file to a local temp directory, return local path.""" """Download a DingTalk file to the media directory, return local path."""
import tempfile from nanobot.config.paths import get_media_dir
try: try:
token = await self._get_access_token() token = await self._get_access_token()
@@ -568,8 +568,8 @@ class DingTalkChannel(BaseChannel):
logger.error("DingTalk file download failed: status={}", file_resp.status_code) logger.error("DingTalk file download failed: status={}", file_resp.status_code)
return None return None
# Save to local temp directory # Save to media directory (accessible under workspace)
download_dir = Path(tempfile.gettempdir()) / "nanobot_dingtalk" / sender_id download_dir = get_media_dir("dingtalk") / sender_id
download_dir.mkdir(parents=True, exist_ok=True) download_dir.mkdir(parents=True, exist_ok=True)
file_path = download_dir / filename file_path = download_dir / filename
await asyncio.to_thread(file_path.write_bytes, file_resp.content) await asyncio.to_thread(file_path.write_bytes, file_resp.content)

View File

@@ -194,14 +194,17 @@ async def test_download_dingtalk_file(tmp_path, monkeypatch) -> None:
]) ])
channel._http._responses[1].content = file_content channel._http._responses[1].content = file_content
# Redirect temp dir to tmp_path # Redirect media dir to tmp_path
monkeypatch.setattr("tempfile.gettempdir", lambda: str(tmp_path)) monkeypatch.setattr(
"nanobot.config.paths.get_media_dir",
lambda channel_name=None: tmp_path / channel_name if channel_name else tmp_path,
)
result = await channel._download_dingtalk_file("code123", "test.xlsx", "user1") result = await channel._download_dingtalk_file("code123", "test.xlsx", "user1")
assert result is not None assert result is not None
assert result.endswith("test.xlsx") assert result.endswith("test.xlsx")
assert (tmp_path / "nanobot_dingtalk" / "user1" / "test.xlsx").read_bytes() == file_content assert (tmp_path / "dingtalk" / "user1" / "test.xlsx").read_bytes() == file_content
# Verify API calls # Verify API calls
assert channel._http.calls[0]["method"] == "POST" assert channel._http.calls[0]["method"] == "POST"