基于http.server改造,具备文件上传功能
时间: 2024-09-08 10:02:49 浏览: 20
基于Python的`http.server`模块可以创建一个简单的HTTP服务器。为了改造它具备文件上传功能,我们需要能够处理POST请求,并且能够解析表单数据,其中包含文件数据。以下是一个简单的例子,展示如何使用`http.server`和`cgi`模块来实现一个可以处理文件上传的基本HTTP服务器。
```python
import http.server
import cgi
import os
from http.server import BaseHTTPRequestHandler, HTTPServer
class FileUploadHandler(BaseHTTPRequestHandler):
def do_POST(self):
# 获取请求头中的内容长度
content_length = int(self.headers['Content-Length'])
# 解析POST数据
post_data = self.rfile.read(content_length)
# 使用cgi.FieldStorage解析POST数据
form = cgi.FieldStorage(
fp = post_data,
headers = self.headers,
environ = {
'REQUEST_METHOD':'POST',
'CONTENT_TYPE':self.headers['Content-Type'],
}
)
# 检查是否有文件上传
if 'file' in form:
# 获取上传的文件
uploaded_file = form['file']
# 获取文件名并安全化文件名,防止路径遍历
file_name = os.path.basename(uploaded_file.filename)
# 保存文件
with open(file_name, 'wb') as fd:
fd.write(uploaded_file.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 uploaded.')
def run(server_class = HTTPServer, handler_class = FileUploadHandler, port = 8000):
server_address = ('', port)
httpd = server_class(server_address, handler_class)
print(f'Starting httpd server on port {port}...')
httpd.serve_forever()
if __name__ == '__main__':
run()
```
这段代码定义了一个`FileUploadHandler`类,它重写了`do_POST`方法,用于处理文件上传的POST请求。服务器使用`cgi.FieldStorage`来解析POST请求中的表单数据。当检测到有文件上传时,服务器会将文件保存到服务器的当前工作目录中,并向客户端返回一个成功的消息。
请注意,这个简单的服务器没有实现用户认证、文件大小限制、错误处理等高级功能,而且应该仅在测试环境中使用。