在 Python 中可以使用内置的http.server
模块和requests
库实现文件的上传下载功能,http.server
是 Python 标准库中提供的一个简单的 HTTP 服务器实现,可以用于在本地提供静态文件或动态内容服务,requests
是 Python 中用来响应 HTTP 请求,处理 URL 数据的库,该库是基于urllib
编写的,相较urllib
,requests
库更加容易操作与学习。
如下是一个使用http.server
模块实现上传文件的服务端代码:
import cgi
import shutil
from http.server import BaseHTTPRequestHandler, HTTPServer
class FileUploadHandler(BaseHTTPRequestHandler):
# 处理 post 请求
def do_POST(self):
# 解析上传的文件数据
form_data = cgi.FieldStorage(fp=self.rfile,headers=self.headers,
environ={'REQUEST_METHOD': 'POST',
'CONTENT_TYPE': self.headers['Content-Type'],})
file_item = form_data['file']
# 保存上传的文件
with open('./server_file.txt', 'wb') as f:
shutil.copyfileobj(file_item.file, f)
# 设置响应码、响应头和响应内容
self.send_response(200)
self.end_headers()
self.wfile.write(b'File uploaded successfully')
# 设置 ip 和端口
server_address = ('', 8080)
# 创建服务对象并启动服务
httpd = HTTPServer(server_address, FileUploadHandler)
print(f'Starting server on port {8080}...')
httpd.serve_forever()
如下是一个使用requests
模块实现上传文件的客户端代码:
import requests
# 定义请求 ip 和端口
url = 'http://localhost:8080'
# 设置上传文件
file_path = './demo.txt'
files = {'file': open(file_path, 'rb')}
# 处理上传
response = requests.post(url, files=files)
print(response.text)
在启动服务端代码后,再启动客户端代码,就可以将与代码同级目录下的demo.txt
文件上传到服务端,我们可以从客户端的启动界面看到上传情况,当出现File uploaded successfully
时则代表上传成功,这时在服务端就会出现一个名为server_file.txt
的文件,该文件中的内容和客户端要上传的文件内容一致。
上述代码中服务端的代码流程如下:
- 首先设置服务端的
ip
和端口号; - 编写处理请求即上传文件的类
FileUploadHandler
,该类继承自http.server
模块的BaseHTTPRequestHandler
类,在FileUploadHandler
中,创建了一个名为do_POST
的函数用于处理 HTTP 服务的post
请求,在函数内部通过用置的cgi
模块获取上传文件的内容file_item
,然后使用with open
方法创建一个新文件server_file.txt
,调用shutil.copyfileobj
方法将file_item
写入新文件server_file.txt
中,最终返回响应码和响应内容File uploaded successfully
; - 创建服务对象并通过
serve_forever
方法启动服务。
上述代码中的客户端流程如下: - 定义请求
ip
和端口号; - 将要上传的文件通过
open
方法转为文件对象files
; - 通过
requests
发送post
请求并将文件对象files
作为请求体; - 获取响应结果。