diff --git a/nanobot/channels/dingtalk.py b/nanobot/channels/dingtalk.py index 8a822ff..ab12211 100644 --- a/nanobot/channels/dingtalk.py +++ b/nanobot/channels/dingtalk.py @@ -538,8 +538,8 @@ class DingTalkChannel(BaseChannel): filename: str, sender_id: str, ) -> str | None: - """Download a DingTalk file to a local temp directory, return local path.""" - import tempfile + """Download a DingTalk file to the media directory, return local path.""" + from nanobot.config.paths import get_media_dir try: token = await self._get_access_token() @@ -568,8 +568,8 @@ class DingTalkChannel(BaseChannel): logger.error("DingTalk file download failed: status={}", file_resp.status_code) return None - # Save to local temp directory - download_dir = Path(tempfile.gettempdir()) / "nanobot_dingtalk" / sender_id + # Save to media directory (accessible under workspace) + download_dir = get_media_dir("dingtalk") / sender_id download_dir.mkdir(parents=True, exist_ok=True) file_path = download_dir / filename await asyncio.to_thread(file_path.write_bytes, file_resp.content) diff --git a/tests/test_dingtalk_channel.py b/tests/test_dingtalk_channel.py index 5bcbcfa..a0b866f 100644 --- a/tests/test_dingtalk_channel.py +++ b/tests/test_dingtalk_channel.py @@ -194,14 +194,17 @@ async def test_download_dingtalk_file(tmp_path, monkeypatch) -> None: ]) channel._http._responses[1].content = file_content - # Redirect temp dir to tmp_path - monkeypatch.setattr("tempfile.gettempdir", lambda: str(tmp_path)) + # Redirect media dir to 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") assert result is not None 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 assert channel._http.calls[0]["method"] == "POST"