欢迎访问宙启技术站
智能推送

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来上传文件。