Python中使用HTTPServer()实现文件上传功能
发布时间:2023-12-26 14:46:21
在Python中,可以使用HTTPServer模块实现文件上传功能。HTTPServer模块提供了基本的HTTP服务器功能,可以接收HTTP请求,处理请求并返回响应。要实现文件上传功能,可以通过继承BaseHTTPRequestHandler类来自定义处理上传请求的处理程序。
下面是一个使用HTTPServer实现文件上传功能的简单示例:
from http.server import BaseHTTPRequestHandler, HTTPServer
import os
class FileUploadHandler(BaseHTTPRequestHandler):
def do_POST(self):
content_type = self.headers['Content-Type']
if content_type.startswith('multipart/form-data'):
self.handle_file_upload()
else:
self.send_response(400)
self.end_headers()
self.wfile.write(b'Invalid Content-Type')
def handle_file_upload(self):
content_type = self.headers['Content-Type']
boundary = content_type.split(';')[1].split('=')[1]
if boundary:
content_length = int(self.headers['Content-Length'])
# 读取请求体中的数据
post_data = self.rfile.read(content_length)
post_data = post_data.decode('utf-8')
# 根据boundary切分数据
parts = post_data.split('--' + boundary)
# 去掉开头和结尾的空部分
parts = parts[1:-1]
for part in parts:
# 将每个部分解析为headers和body
header, body = part.split('\r
\r
', 1)
# 获取filename和filepath
filename = self.get_filename(header)
filepath = os.path.join(os.getcwd(), 'uploads', filename)
# 将文件内容写入本地文件
with open(filepath, 'wb') as f:
f.write(body.encode('utf-8'))
self.send_response(200)
self.end_headers()
self.wfile.write(b'File uploaded successfully')
def get_filename(self, header):
filename = ''
for line in header.split('\r
'):
if line.startswith('Content-Disposition:'):
_, params = line.split(':', 1)
for param in params.split(';'):
key, value = param.strip().split('=')
if key == 'filename':
filename = value.strip('"')
return filename
def run(server_class=HTTPServer, handler_class=FileUploadHandler, port=8000):
server_address = ('', port)
httpd = server_class(server_address, handler_class)
print(f'Starting server on port {port}...')
httpd.serve_forever()
if __name__ == '__main__':
run()
上述示例中的FileUploadHandler类继承自BaseHTTPRequestHandler类,并重写了do_POST()方法来处理POST请求。在do_POST方法中,首先判断请求的Content-Type是否为multipart/form-data类型,如果是,则调用handle_file_upload()方法处理文件上传请求。
handle_file_upload()方法首先解析请求头中的boundary,然后根据boundary将请求体切分为多个部分。然后遍历每个部分,解析出文件名和文件内容,并将文件内容写入指定目录中。最后,返回200状态码和成功上传的信息。
示例中的run()函数用于启动HTTPServer,并指定监听的端口。
使用上述示例中的代码,可以在本地启动一个HTTP服务器,接收文件上传的POST请求,并将上传的文件保存到指定的目录中。启动服务器后,可以通过发送POST请求到http://localhost:8000来上传文件。
