[Python http.server] 搭建http服务器用于下载/上传文件

动机:笔者需测试bs架构下的文件上传与下载性能,故想通过Python搭建http服务器并实现客户端与服务器之间的文件上传和下载需求

难点:这应该是很基础的东西,不过笔者之前未接触过http编程,谨在此记录下学习的过程,可能不是最优解

方法:在服务器端部署html页面,并执行监听的Python代码,在客户端操作实现文件的上传与下载

1 [服务端] 创建本地文件夹用于开启http服务

首先开启power shell,在服务端本地创建一个文件夹用于开启http服务,例如创建了一个E:\WebServer文件夹,如图所示:

 进入power shell,输入命令:

cd E:\WebServer

输入开启http指令:

python -m http.server

出现如下情况,说明成功:

 此时,我们便可以在服务器的浏览器地址栏输入本机ip地址+端口号来访问http页面,例如:

http://172.1.1.1:8000

 至于本机ip地址,可以从右键“网络”,点击你的网络连接的蓝字,详细信息里面的ipv4地址进行查看,如图所示:

 此时,浏览器中的页面应该是这样:

看见这个页面,第一步就完成了!


2 [服务端] 编写监听脚本,用于客户端上传文件

在服务器端根文件夹下创建一个Python脚本(在别的地方创建应该也行,没试过):

from http.server import BaseHTTPRequestHandler, HTTPServer
import time# 创建自定义的请求处理类
class FileUploadHandler(BaseHTTPRequestHandler):def do_POST(self):start_time = time.time()content_length = int(self.headers['Content-Length'])# 读取客户端发送的二进制文件数据file_data = self.rfile.read(content_length)# 在这里可以对接收到的文件数据进行处理,例如保存到磁盘with open('uploaded_file.bin', 'wb') as file:file.write(file_data)self.send_response(200)self.end_headers()self.wfile.write(b'File uploaded successfully.')end_time = time.time()time_elapsed_ms = int((end_time - start_time) * 1000)print(f"Update in {time_elapsed_ms} ms")# 启动服务器
def run_server():server_address = ('your web server', 8000)  # 可以根据需要修改端口号httpd = HTTPServer(server_address, FileUploadHandler)print('Server running on port 8000...')httpd.serve_forever()# 运行服务器
run_server()

注意,在 ‘your web server’ 处输入自己的ip地址


3 [服务端] 编写html脚本,用于显示上传文件界面

<!DOCTYPE html>
<html><head><script src="https://ajax.aspnetcdn.com/ajax/jQuery/jquery-3.6.0.js" type="text/javascript"></script><!-- <script src="./jquery-3.6.0.js" type="text/javascript"></script> --><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
</head><body><form id="uploadForm" action="/upload" enctype="multipart/form-data" method="post" onsubmit="return submitFile()"><div><input type="file" name="file" multiple></div><br><div><input type="submit" value="upload"> </div></form><script>function submitFile() {// formData = new FormData($('#uploadForm')[0])files = $('#uploadForm')[0].file.filesfor (i = 0; i < files.length; i++) {$.ajax({url: "/upload?fileName=" + encodeURIComponent(files[i].name),type: "POST",data: files[i],success: function (data) {console.info("success", data);},error: function (data) {console.warn("fail", data);},processData: false,contentType: "multipart/form-data",// contentType: "application/octet-stream"});}return false;}</script>
</body></html>

上述代码参考了:python HTTPServer 实现文件上传下载_xiekch的博客-CSDN博客  

将上述代码写入到记事本文件,再保存成html文件,放入服务器根目录,并命名为index.html

http页面便会更改成既定样式,即此时再次打开http页面,应该呈现:


4 [客户端] 编写上传文件脚本

使用另一台电脑充当客户端,编写上传文件的Python脚本:

import requests
import os# 指定服务器URL和要上传的文件路径
server_url = 'http://your web server:8000/upload'
file_path = '/your file path/file.bin'testResponse = requests.get(server_url)
if testResponse.status_code == 200:print("与服务器的连接正常!")
else:print("无法连接到服务器!")with open(file_path, 'rb') as file:file_data = file.read()response = requests.post(server_url, files={'file': 'file'})if response.status_code == 200:print("文件上传成功!")
else:print("文件上传失败!")

同样注意,在 ‘your web server’ 处输入自己的ip地址,在your file path写上文件路径

Windows系统下,文件路径可以使用双斜杠:

http://172.1.1.1:8000//data.bin

 MacOS系统下,目前测试可以使用如下格式:

'/users/north/desktop/data.bin'

[客户端] 编写下载文件脚本

同样的,使用另一个Python文件编写下载文件脚本:

import time
import requestsresponse = requests.get("http://your web server:8000//file.bin")
with open("data.bin", "wb") as f:
f.write(response.content)

再次,在 ‘your web server’ 处输入自己的ip地址


[客户端] 实现效果

上述步骤都准备充分后,运行 [服务端] 监听脚本,此时Python IDE的Terminal窗口应提示:

同时,脚本应处于一直运行状态(当前显示停止键则为正在持续运行),以持续监听:

 此时运行[客户端]的下载文件脚本,可将服务器中的目标文件进行下载,笔者又另行编写了一个记录下载时间的功能,出现下述结果说明下载成功,当然,也可以用类似于上传问价脚本的判断机制进行文件是否下载成功的判断

[客户端]进入服务器的http地址,选择本地文件进行上传:

同样的,[服务器]监听终端出现如下消息说明上传成功:

 [服务器]根目录会出现暂存文件,后续若需要进一步对该暂存文件进行处理则可以进一步修改脚本

230524修订:需要在运行服务端监听脚本前就在客户端进入上传文件页面,否则会产生Error,因暂不影响功能实现,目前尚未研究成因 


The End

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/472720.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电脑选购:CPUi5/i7/i9到底该怎么选

目录 电脑选购指南 什么是i5/i7/i9介绍 数字越大CPU就越好吗 看懂了名字&#xff0c;还需要注意什么&#xff1f; &#xff08;1&#xff09;核心数 &#xff08;2&#xff09;线程数 &#xff08;3&#xff09;主频 &#xff08;4&#xff09;缓存 电脑选购指南 大家在…

亚马逊测评有风险为什么还有人做?

亚马逊老卖家都知道&#xff0c;测评可以快速帮助他们的产品添加评论&#xff0c;获得排名&#xff0c;打造爆款&#xff0c;然而现在市面情况是90%的测评机构资源是烂资源&#xff0c;机刷&#xff0c;黑卡这些层出不穷&#xff0c;好点的资源已经很难发现了 我这边也是了解到…

CCF编程能力等级认证GESP—C++6级—20231209

CCF编程能力等级认证GESP—C6级—20231209 单选题&#xff08;每题 2 分&#xff0c;共 30 分&#xff09;判断题&#xff08;每题 2 分&#xff0c;共 20 分&#xff09;编程题 (每题 25 分&#xff0c;共 50 分)闯关游戏工作沟通 答案及解析单选题判断题编程题1编程题2 单选题…

MATLAB离线文档安装

MATLAB离线文档安装 来源于最全matlab安装离线文档教程只是对内容进行了精简&#xff0c;同时更方便查找 一、下载离线文档 我上传的2023b离线文档 提供本体属于违规行为&#xff0c;本体下载链接已删除 为方便已安装好软件的朋友想安装离线帮助文档&#xff0c;由于官网下载…

论文阅读:MotionNet基于鸟瞰图的自动驾驶联合感知和运动预测

MotionNet: Joint Perception and Motion Prediction for Autonomous Driving Based on Bird’s Eye View Maps MotionNet&#xff1a;基于鸟瞰图的自动驾驶联合感知和运动预测 论文地址&#xff1a;MotionNet: Joint Perception and Motion Prediction for Autonomous Drivi…

windows 下跑起大模型(llama)操作笔记

原贴地址&#xff1a;https://testerhome.com/topics/39091 前言 国内访问 chatgpt 太麻烦了&#xff0c;还是本地自己搭一个比较快&#xff0c;也方便后续修改微调啥的。 之前 llama 刚出来的时候在 mac 上试了下&#xff0c;也在 windows 上用 conda 折腾过&#xff0c;环…

adobe软件提示This non-genuine Adobe app will be disabled soon【软件版本】

因为电脑上级路由器装了小飞机&#xff0c;导致本机电脑ps等adobe的系列软件出现了 This non-genuine Adobe app will be disabled soon&#xff0c;烦人的狠&#xff0c;之前有写过一篇通过更改host的教程&#xff0c;现在已经失效了&#xff0c;今天为大家分享一个用软件来屏…

数字孪生与智慧城市:共筑未来城市的科技基石

一、引言 随着科技的飞速发展&#xff0c;数字孪生与智慧城市已成为未来城市建设的两大关键技术。数字孪生为城市提供了一个虚拟的数字镜像&#xff0c;使我们能全面、深入地了解城市的运行状态。而智慧城市则借助先进的信息通信技术&#xff0c;提升城市的智能化水平&#xf…

SG5032VEN晶体振荡器SPXO

在高速数字通信和精密电子系统中&#xff0c;时钟信号的质量至关重要。SG5032VEN晶体振荡器&#xff08;SPXO&#xff09;凭借其低相位抖动的LVDS输出&#xff0c;为这些应用提供了理想选择。提供频率范围:200.1 MHz ~ 500mhz&#xff0c;满足了从高速网络到数据中心等不同应用…

力扣_面试题:配对交换

配对交换 链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 题目意思就是交换相邻两个二进制位 &#xff0c;用&分别取出even&#xff08;偶位和&#xff09;odd&#xff08;奇位和&#xff09; 偶位和用0xAAAAAAAA&#xff0c;奇…

Mysql中关于on,in,as,where的区别

目录 Mysql on,in,as,where的区别 Mysql语句问题解决 1、left join数据筛选问题 2、相同数据重复筛选使用问题 3、根据某个字段排序取每个类别最后三条数据或前三条数据 4、业务逻辑书写位置问题 5、查找另一表内和本表相关字段的数量 6、关于union的使用 7、limit的巧…

爬虫-华为云空间备忘录导出到docx-selenium控制浏览器行为-python数据处理

背景适用情况介绍 老的荣耀手机属于华为云系统&#xff0c;家里人换了新荣耀手机属于荣耀云系统无法通过云空间将备忘录转移到新手机&#xff0c;不想让他们一个一个搞&#xff0c;于是整了一晚上想办法爬取下来。从网页抓取下来&#xff0c;然后存到docx文档中&#xff08;包…