鱼C论坛

 找回密码
 立即注册
查看: 99|回复: 1

python的http.server建立的临时server,只能从客户侧下载文件,怎么下载目录呢?

[复制链接]
发表于 2025-8-12 14:46:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
局域网内想在不压缩文件的情况下,想从客户端的浏览器里下载一个大目录(目录下有多个文件及多级子目录,子目录下又有文件)
1.网上的绿色软件基本都有毒,像飞鸽传书等。或者要被装1大堆软件
2.网络共享有时设置麻烦

用 python的http.server的话,很方便,但从客户端浏览器里只能下单文件?

1.有没有办法用 python 的http.server 把整个服务器共享出来的目录下下来? 一个一个拖文件不太可行。
2.有没有办法多线程?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2025-8-12 14:48:05 | 显示全部楼层
在 Python 的 `http.server` 默认配置下,浏览器无法直接下载整个目录(含子目录结构)。以下是符合你需求的解决方案:

### 解决方案:打包目录为 ZIP 文件(不压缩)
虽然你要求不压缩,但浏览器无法直接下载文件夹结构。最接近的方式是**将目录打包为 ZIP 文件(使用存储模式不压缩)**,用户下载后解压即可得到原始文件结构。

#### 操作步骤:
1. 使用此自定义 Python 脚本启动服务器(保存为 `server.py`):
  1. import http.server
  2. import socketserver
  3. import os
  4. import zipfile
  5. from io import BytesIO

  6. PORT = 8000

  7. class CustomHandler(http.server.SimpleHTTPRequestHandler):
  8.     def do_GET(self):
  9.         if self.path == '/download':
  10.             # 打包当前目录(不压缩)
  11.             buffer = BytesIO()
  12.             with zipfile.ZipFile(buffer, 'w', zipfile.ZIP_STORED) as zipf:
  13.                 for root, dirs, files in os.walk('.'):
  14.                     for file in files:
  15.                         path = os.path.join(root, file)
  16.                         zipf.write(path, os.path.relpath(path))
  17.             
  18.             self.send_response(200)
  19.             self.send_header('Content-Type', 'application/zip')
  20.             self.send_header('Content-Disposition', 'attachment; filename="folder.zip"')
  21.             self.end_headers()
  22.             buffer.seek(0)
  23.             self.wfile.write(buffer.getvalue())
  24.         else:
  25.             super().do_GET()

  26. with socketserver.TCPServer(("", PORT), CustomHandler) as httpd:
  27.     print(f"服务器已启动,访问 http://localhost:{PORT}")
  28.     print("下载整个目录: http://localhost:8000/download")
  29.     httpd.serve_forever()
复制代码


2. **启动服务器**(在要共享的目录中运行):
  1. python server.py
复制代码


3. 在浏览器访问:
   - 浏览文件:`http://<服务器IP>:8000`
   - **下载整个目录**:`http://<服务器IP>:8000/download`

---

### 关键说明:
1. **ZIP_STORED 模式**:文件仅打包不压缩,速度极快,解压后得到原始文件
2. **目录结构保留**:子目录和文件名保持不变
3. **无需额外软件**:浏览器直接下载 ZIP,系统自带解压功能

---

### 替代方案(命令行下载)
如果客户端能使用命令行工具:
  1. # 在客户端执行(替换IP为服务器IP)
  2. wget -r -nH --cut-dirs=1 http://<服务器IP>:8000/
复制代码

参数说明:
- `-r`:递归下载
- `-nH`:不创建主机名前缀
- `--cut-dirs=1`:忽略服务器路径层级

---

### 多线程下载说明
Python 的 `http.server` 默认单线程,如需多线程支持:
  1. # 替换 TCPServer 为 ThreadingHTTPServer
  2. from http.server import ThreadingHTTPServer
  3. httpd = ThreadingHTTPServer(("", PORT), CustomHandler)
复制代码

这样可同时处理多个客户端请求(但单个文件下载仍受限于网络带宽)。

> 提示:大文件下载建议用专业工具(如 rsync),HTTP 协议本身不支持断点续传目录。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-9-1 11:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表