Python3 HTTP Server 文件上传

概述

HTTP是一种用于传输超文本的应用层协议,常用于Web应用中。HTTP协议定义了客户端和服务器之间的通信规则,包括请求和响应的格式。在Web开发中,常常需要实现文件上传功能,其中Python3提供了一个简单而强大的内置模块http.server,可以用于创建一个基本的HTTP服务器,并且能够处理文件上传请求。

本文将介绍如何使用Python3的http.server模块来实现一个简单的HTTP服务器,并支持文件上传功能。

实现步骤

1. 创建一个HTTP服务器

首先,我们需要创建一个HTTP服务器来处理请求。在Python3中,可以使用内置模块http.server来创建一个基本的HTTP服务器。

import http.server
import socketserver

def run(server_class=http.server.HTTPServer, handler_class=http.server.BaseHTTPRequestHandler):
    server_address = ('', 8000)
    httpd = server_class(server_address, handler_class)
    print('Starting server...')
    httpd.serve_forever()

run()

上述代码中,我们定义了一个run函数,用于创建HTTP服务器。在main函数中,我们调用run函数来启动服务器,并监听在8000端口上。

2. 处理文件上传请求

接下来,我们需要扩展BaseHTTPRequestHandler类来处理文件上传请求。在处理请求时,我们需要解析HTTP请求的头部,获取文件名和文件内容,并将文件保存到服务器端。

class MyHandler(http.server.BaseHTTPRequestHandler):
    def do_POST(self):
        content_type = self.headers['Content-Type']
        if content_type.startswith('multipart/form-data'):
            boundary = content_type.split(';')[1].split('=')[1]
            content_length = int(self.headers['Content-Length'])
            body = self.rfile.read(content_length)
            fields = body.split(b'--' + boundary.encode())

            for field in fields:
                if field.startswith(b'Content-Disposition'):
                    filename = re.findall(r'filename=[\'"]?([^\'"\s]+)[\'"]?', field.decode())
                    if filename:
                        filename = os.path.basename(filename[0])
                        data = field.split(b'\r\n\r\n')[1].rstrip(b'\r\n--')
                        with open(filename, 'wb') as f:
                            f.write(data)

        self.send_response(200)
        self.send_header('Content-type', 'text/html')
        self.end_headers()
        self.wfile.write(b'File uploaded successfully.')

run(handler_class=MyHandler)

在上述代码中,我们扩展了BaseHTTPRequestHandler类,并重写了do_POST方法。在do_POST方法中,我们首先获取请求头部的Content-Type字段,用于判断是否是文件上传请求。然后,我们解析请求体,通过正则表达式获取到文件名和文件内容,并将文件保存到服务器端。

3. 启动HTTP服务器

最后,我们需要启动HTTP服务器,并指定处理请求的处理类。

run(handler_class=MyHandler)

使用示例

运行上述代码后,可以在浏览器中访问http://localhost:8000来测试文件上传功能。

在表单中选择一个文件,并点击提交按钮,即可将文件上传到服务器端。上传成功后,浏览器将显示"File uploaded successfully."的提示信息。

总结

使用Python3的http.server模块可以很方便地实现一个基本的HTTP服务器,并支持文件上传功能。通过解析HTTP请求的头部和请求体,我们可以获取到文件名和文件内容,并将文件保存到服务器端。

上述代码仅实现了一个简单的文件上传功能,可以根据实际需求进行扩展和优化。希望本文能对你理解Python3的http.server模块和文件上传功能有所帮助。

参考资料

  • Python官方文档: [