Python 实现上传下载文件

在 Python 中可以使用内置的http.server模块和requests库实现文件的上传下载功能,http.server是 Python 标准库中提供的一个简单的 HTTP 服务器实现,可以用于在本地提供静态文件或动态内容服务,requests是 Python 中用来响应 HTTP 请求,处理 URL 数据的库,该库是基于urllib编写的,相较urllibrequests库更加容易操作与学习。
如下是一个使用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作为请求体;
  • 获取响应结果。
  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值