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

Python中使用http.server.HTTPServer模块实现简单的文件上传服务

发布时间:2024-01-09 20:47:31

在Python中,可以使用http.server.HTTPServer模块来实现一个简单的文件上传服务。下面是一个使用例子,详细说明了如何使用该模块来创建一个文件上传服务:

import cgi
from http.server import BaseHTTPRequestHandler, HTTPServer

class RequestHandler(BaseHTTPRequestHandler):
    def do_POST(self):
        form = cgi.FieldStorage(
            fp=self.rfile,
            headers=self.headers,
            environ={'REQUEST_METHOD': 'POST'}
        )

        # 检查是否存在上传的文件
        if 'file' not in form:
            self.send_response(400)
            self.end_headers()
            self.wfile.write(b'No file uploaded.')
            return

        file_item = form['file']

        # 检查文件是否被成功上传
        if file_item.filename:
            with open(file_item.filename, 'wb') as file:
                file.write(file_item.file.read())
            self.send_response(200)
            self.end_headers()
            self.wfile.write(b'File uploaded successfully.')
        else:
            self.send_response(500)
            self.end_headers()
            self.wfile.write(b'File upload failed.')

def run(server_class=HTTPServer, handler_class=RequestHandler, port=8000):
    server_address = ('', port)
    httpd = server_class(server_address, handler_class)
    print(f'Starting file upload server on port {port}...')
    httpd.serve_forever()

if __name__ == '__main__':
    run()

上述代码中,我们定义了一个自定义的RequestHandler类,继承自http.server.BaseHTTPRequestHandler。在该类中,我们重写了do_POST方法来处理客户端的POST请求。

在do_POST方法中,首先使用cgi.FieldStorage类来解析POST请求的内容,该类可以解析包含上传文件的POST请求。然后我们检查是否存在上传的文件,如果没有文件,则返回错误响应码400。如果存在上传的文件,我们将其写入到服务器本地的文件中,并返回成功响应码200。

最后,在main函数中,我们调用run函数来启动HTTP服务器。默认情况下,服务器将监听8000端口,你可以通过调用run函数时传入port参数来修改监听的端口。

要运行该文件上传服务,只需在终端中运行该脚本,并访问http://localhost:8000/。在页面上选择要上传的文件,然后点击上传按钮即可。如果文件上传成功,会显示"File uploaded successfully.",否则将显示"File upload failed."。

这只是一个简单的文件上传服务的示例,你可以根据自己的需求,对代码进行修改和扩展。同时,还可以使用其他第三方库(如Flask、Django等)来实现更加复杂和强大的文件上传服务。