Stream Jupyter workspace file downloads

This commit is contained in:
wuyang6
2026-05-13 18:15:53 +08:00
parent ef703ff49b
commit f2989cd48b
3 changed files with 111 additions and 6 deletions
+44
View File
@@ -647,6 +647,50 @@ print(json.dumps(entries, ensure_ascii=False))
name = str(payload.get('name') or PurePosixPath(target).name or 'remote-file')
return data, name
def file_info(self, path: str) -> dict[str, Any]:
target = self.resolve_workspace_path(path)
api_path = api_path_for_absolute_path(target)
url = f'{self.binding.base_url}/api/contents/{quote(api_path, safe="/")}'
response = self._session.get(
url,
params={'content': 0},
headers={'X-XSRFToken': self._xsrf_token},
timeout=30,
)
if response.status_code >= 400:
raise JupyterRuntimeError(
f'Unable to inspect remote file: HTTP {response.status_code} {response.text[:500]}'
)
payload = response.json()
if payload.get('type') != 'file':
raise JupyterRuntimeError('Remote path is not a file.')
name = str(payload.get('name') or PurePosixPath(target).name or 'remote-file')
size = payload.get('size')
return {
'name': name,
'path': target,
'size': int(size) if isinstance(size, int) and size >= 0 else None,
}
def open_file_stream(self, path: str) -> tuple[Any, str]:
"""打开远端文件流,由调用方负责关闭 response。"""
target = self.resolve_workspace_path(path)
api_path = api_path_for_absolute_path(target)
url = f'{self.binding.base_url}/files/{quote(api_path, safe="/")}'
response = self._session.get(
url,
headers={'X-XSRFToken': self._xsrf_token},
stream=True,
timeout=(10, 300),
)
if response.status_code >= 400:
response.close()
raise JupyterRuntimeError(
f'Unable to stream remote file: HTTP {response.status_code} {response.text[:500]}'
)
return response, str(PurePosixPath(target).name or 'remote-file')
def read_text(
self,
path: str,