http 文件下载和上传服务
文章目录
- 文件传输需求
- 下载
- 上传
文件传输需求
局域网内经常会出现两台电脑传输文件的场景,
基于该场景,需求是,一台电脑开启 http 服务,另一台电脑通过浏览器下载和上传文件。
下载
下载很方便,一行命令就解决了
liyongjun@box:~/nvme/http$ sudo python3 -m http.server 80 --bind 192.168.37.83
Serving HTTP on 192.168.37.83 port 80 (http://192.168.37.83:80/) …
172.16.21.48 - - [10/Feb/2025 17:04:25] “GET / HTTP/1.1” 200 -
172.16.21.48 - - [10/Feb/2025 17:04:50] “GET /env.zip HTTP/1.1” 200 -
172.16.21.48 - - [10/Feb/2025 17:05:27] “GET /ghs.rar HTTP/1.1” 200 -
上传
upload.py
from http.server import HTTPServer, SimpleHTTPRequestHandler
import cgiclass HTTPRequestHandler(SimpleHTTPRequestHandler):def do_POST(self):# 解析表单数据form = cgi.FieldStorage(fp=self.rfile,headers=self.headers,environ={'REQUEST_METHOD': 'POST','CONTENT_TYPE': self.headers['Content-Type'],})# 获取上传的文件file_item = form['file']if file_item.filename:# 设置文件保存路径file_path = './uploads/' + file_item.filenamewith open(file_path, 'wb') as file_out:file_out.write(file_item.file.read())self.send_response(200)self.end_headers()self.wfile.write(b"File uploaded successfully!")else:self.send_response(400)self.end_headers()self.wfile.write(b"No file received.")def do_GET(self):# 提供一个简单的HTML表单用于上传文件self.send_response(200)self.send_header('Content-type', 'text/html')self.end_headers()self.wfile.write(b"""<html><head><title>Upload File</title></head><body><h2>Upload File</h2><form method="POST" enctype="multipart/form-data"><input type="file" name="file" /><input type="submit" value="Upload" /></form></body></html>""")# 配置服务器
port = 8000
server_address = ('', port)
httpd = HTTPServer(server_address, HTTPRequestHandler)print(f"Starting httpd server on port {port}...")
httpd.serve_forever()
mkdir uploads
liyongjun@box:~/nvme/http$ python3 upload.py
Starting httpd server on port 8000…
172.16.21.48 - - [10/Feb/2025 19:02:40] “GET / HTTP/1.1” 200 -
172.16.21.48 - - [10/Feb/2025 19:03:02] “POST / HTTP/1.1” 200 -
172.16.21.48 - - [10/Feb/2025 20:05:40] “GET / HTTP/1.1” 200 -
172.16.21.48 - - [10/Feb/2025 20:05:44] “POST / HTTP/1.1” 200 -
172.16.21.48 - - [10/Feb/2025 20:14:57] “GET / HTTP/1.1” 200 -
172.16.21.48 - - [10/Feb/2025 20:22:50] “GET / HTTP/1.1” 200 -