Python 实现http server接收mutipart/form-data文件 方法2

Python 实现http server接收mutipart/form-data文件 方法2

    • 1 Server端代码
    • 2 测试

1 Server端代码

以下代码亲测有效,仅适应于接收客户端上传的图片,其他文件未曾测试,作者主要应用于平时的自测工具。
说明1: 如有特殊需求,请自行更改,有意见,评论区留言。
说明2: 建议使用这个方法用于生产、成熟软件开发。Python 实现http server接收mutipart/form-data文件 方法1

from dataclasses import replace
from http.server import HTTPServer, BaseHTTPRequestHandler
import json,os,re,chardet,posixpath,codecs
from urllib.parse import unquoteclass Resquest(BaseHTTPRequestHandler):def do_POST(self):print("headers:", self.headers)print("command:",self.command)print("path:",self.path)bdy = self.headers.get_boundary()if not  bdy is None:print(" = in headers")boundary = self.headers['content-type'].split("=")[1]print("boundary:",boundary)if "Boundary" in boundary :print("parser image")self.deal_post_data()else :print("can't handle boundary")else :print(" = not in headers")req_datas = self.rfile.read(int(self.headers['content-length'])) print("--------------------接受client发送的数据----------------")res1 = req_datas.decode('utf-8')res = json.loads(req_datas)print(res)#f = open('1.txt', 'w')#f.write(req_datas.decode())#f.close()#print(req_datas)print("--------------------接受client发送的数据完毕------------------")#data1 = {'bbb':'222'}#data = json.dumps(data1)#self.send_response(200)#self.send_header('Content-type', 'application/json')#self.end_headers()#self.wfile.write(data)def deal_post_data(self):boundary = self.headers["Content-Type"].split("=")[1].encode('ascii')print("boundary===", boundary)remain_bytes = int(self.headers['content-length'])print("remain_bytes===", remain_bytes)res = []line = self.rfile.readline()print("line=",line)bdarys = boundary.decode()bdarys = bdarys.replace(" ","")boundary = bdarys.encode()while boundary in line and str(line, encoding = "utf-8")[-4:] != "--\r\n":#line = self.rfile.readline()remain_bytes -= len(line)if boundary not in line:return False, "Content NOT begin with boundary"line = self.rfile.readline()remain_bytes -= len(line)print("line!!!==",str(line))    strLine = str(line)      fn = strLine.split(';') [2].replace(' filename=','')fn= fn[:-5]print("fn==",fn)if not fn:print("False, Can't find out file name...")return False, "Can't find out file name..."path = translate_path(self.path)print("path==",path)fname = fn#fname = fname.replace("\\", "\\\\")fname = self.str_to_chinese(fname)print("fname==",fname)fn = os.path.join(path, fname)print("SavefilePath==",fn)dirname = os.path.dirname(fn)if not os.path.exists(dirname):os.makedirs(dirname)line = self.rfile.readline()remain_bytes -= len(line)line = self.rfile.readline()# b'\r\n'remain_bytes -= len(line)try:out = open(fn, 'wb')except IOError:return False, "Can't create file to write, do you have permission to write?"pre_line = self.rfile.readline()print("pre_line", pre_line)remain_bytes -= len(pre_line)print("remain_bytes", remain_bytes)Flag = Truewhile remain_bytes > 0:line = self.rfile.readline()#print("while line", line)if boundary in line:remain_bytes -= len(line)pre_line = pre_line[0:-1]if pre_line.endswith(b'\r'):pre_line = pre_line[0:-1]out.write(pre_line)out.close()#return True, "File '%s' upload success!" % fnres.append("File '%s' upload success!" % fn)Flag = Falsebreakelse:out.write(pre_line)pre_line = lineif pre_line is not None and Flag == True:out.write(pre_line)out.close()res.append("File '%s' upload success!" % fn)#return False, "Unexpect Ends of data."return True, resdef str_to_chinese(self,var):not_end = Truewhile not_end:start1 = var.find("\\x")# print start1if start1 > -1:str1 = var[start1 + 2:start1 + 4]print(str1)start2 = var[start1 + 4:].find("\\x") + start1 + 4if start2 > -1:str2 = var[start2 + 2:start2 + 4]start3 = var[start2 + 4:].find("\\x") + start2 + 4if start3 > -1:str3 = var[start3 + 2:start3 + 4]else:not_end = Falseif start1 > -1 and start2 > -1 and start3 > -1:str_all = str1 + str2 + str3# print str_allstr_all = codecs.decode(str_all, "hex").decode('utf-8')str_re = var[start1:start3 + 4]# print str_all, "   " ,str_revar = var.replace(str_re, str_all)# print var.decode('utf-8')return vardef translate_path(path):"""Translate a /-separated PATH to the local filename syntax.Components that mean special things to the local file system(e.g. drive or directory names) are ignored.  (XXX They shouldprobably be diagnosed.)"""# abandon query parameterspath = path.split('?', 1)[0]path = path.split('#', 1)[0]path = posixpath.normpath(unquote(path))words = path.split('/')words = filter(None, words)path = os.getcwd()for word in words:drive, word = os.path.splitdrive(word)head, word = os.path.split(word)if word in (os.curdir, os.pardir):continuepath = os.path.join(path, word)return pathif __name__ == '__main__':host = ('192.168.1.16', 18098)server = HTTPServer(host, Resquest)print("Starting server, listen at: %s:%s" % host)server.serve_forever()

2 测试

参见链接文章中的客户端测试方法进行测试。
如有其他需求或问题,烦请评论区留言。
Python 实现http server接收mutipart/form-data文件 方法1

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

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

相关文章

OpenRemote: Java 开源 IoT 物联网开发平台,匹配智慧城市、智能家居、能源管理

OpenRemote 是一个直观、用户友好的基于Java语言的开源 IoT 物联网设备管理平台,它包括从连接设备到构建应用程序和特定领域的智能应用程序的所有功能和特性。通过OpenRemote物联网平台,用户可以收集和处理来自不同设备的传感器数据,适用于智…

STM32学习笔记

前言 今天开始学习STM32,公司封闭git网络,所以选择CSDN来同步学习进度,方便公司和家里都能更新学习笔记。 参考学习资料 江科大STM32教学视频: 江科大自动协STM32视频_哔哩哔哩_bilibili

Java Kids-百倍提速【Mac IOS】

引言:当今社会,创新和提升效率已经成为了大家普遍的追求。无论是个人生活还是企业经营,我们都希望能够以更高的效率完成任务,节省时间和资源。因此,提速成为了一种时代的要求,而"Java Kids 百倍提速&q…

C#进阶——反射(Reflection)

定义:反射指的是在运行时动态地获取、检查和操作程序中的类型信息,而在我们的Unity中反射允许开发者在运行时通过代码来访问和修改对象的属性、方法和字段,而不需要提前知道这些成员的具体信息。 举一个例子,我们使用反射在运行的…

c++ --- 归并排序

2、归并排序 步骤: 选取中间点 mid (LR)/2递归排序 左边left 和 右边 right归并 ---- 将数组合二为一 模板代码 int temp[10]; void merge_sort(int q[], int l, int r) {//如果左右边界相等 直接退出if (l > r) return;//获取数组中心int mid (l r) / 2;/…

python实现批量数据库数据插入

import pandas as pd import pymysql # 连接 MySQL 数据库 conn pymysql.connect( hostlocalhost, useryour_username, passwordyour_password, databaseyour_database_name, charsetutf8mb4, ) # 读取已有数据 existing_data pd.read_csv("86w全…

Vue双向绑定原理

响应式原理 响应式是Vue的核心特性之一,数据驱动视图,我们修改数据视图随之响应更新,其原理是: ⚡️ 通过数据劫持结合发布和-订阅者模式的方式,通过拦截对数据的操作,在数据变动时发 布消息给订阅者&…

python yaml库:safe_load()(安全解析函数,解析yaml)(防止yaml文件中包含恶意代码)

文章目录 Python YAML: 使用 safe_load 进行安全解析什么是 safe_load?如何使用 safe_load?为什么选择 safe_load 而非 load? Python YAML: 使用 safe_load 进行安全解析 YAML (YAML Ain’t Markup Language) 是一种人类可读的数据序列化标准。它被广泛用于配置文件、多语言…

Element el-table 表格内容 样式错乱的问题

表格切换样式错乱展示 因为切换行的高度变化可能未异步渲染 解决方法&#xff1a; 在需要使用v-if渲染的el-table-column元素上加上一个不重复的key值即可解决问题 :key“Math.random()” <el-table-columnprop""label"问题"width"630.5px":…

day35

今日内容概要 Socket抽象层(socket编程) 基于TCP协议的借助socket可以编程客户端和服务端的程序 链接循环 通信循环 基于UDP协议的套接字(socket)编程 粘包现象 如何解决粘包现象(重要的是解决的思路) struct模块的使用(打包、解包) 今日内容详细 Socket抽象层&#x…

Selenium自动化测试总结

一、Selenium自动化测试&#xff08;基于python&#xff09; 1、Selenium简介&#xff1a; 1.1 Selenium是一款主要用于Web应用程序自动化测试的工具集合。Selenium测试直接运行在浏览器中&#xff0c;本质是通过驱动浏览器&#xff0c;模拟浏览器的操作&#xff0c;比如跳转、…

Qt 样式表大全整理

【QT】史上最全最详细的QSS样式表用法及用例说明_qt样式表使用大全_半醒半醉日复日&#xff0c;花落花开年复年的博客-CSDN博客 QT样式表的使用_qt 设置按下 release hover 按钮样式表_create_right的博客-CSDN博客 QPushButton {border-image: url(:/Start_Stop.png); } QPu…

Python 爬虫实战

Python爬虫可以用于爬取淘宝商品数据&#xff0c;并对这些数据进行数据分析。下面是一个简单的示例&#xff0c;展示如何使用Python爬取淘宝商品数据并进行数据分析。 首先&#xff0c;需要使用Python的requests库和BeautifulSoup库来爬取淘宝商品页面。以下是一个简单的示例代…

你的助听器装置效果好吗?

作者&#xff1a;兰明 助听效果的好坏是一个多维的概念&#xff0c;简单的讲就是能使听障人士成功地应付生活的程度。影响助听装置效果的因素主要有三个方面&#xff1a;听障人士自身的因素、助听装置本身的因素以及专业服务的因素。其中病史超过半年的听障人士自身的因素&…

【linux】重定向+缓冲区

重定向缓冲区 1.重定向1.1重定向本质1.2重定向接口1.3重定向分类1.3.1>输出重定向1.3.2>>追加重定向1.3.3<输入重定向 2.理解 >&#xff0c; >>&#xff0c; <3.如何理解linux下一切皆文件4.缓冲区4.1理解缓冲区问题4.1.1为什么要有缓冲区4.1.2缓冲区刷…

数据结构:平衡二叉树

平衡二叉树 平衡二叉树&#xff0c;又称为AVL树。实际上就是遵循以下两个特点的二叉树&#xff1a; 每棵子树中的左子树和右子树的深度差不能超过 1&#xff1b;二叉树中每棵子树都要求是平衡二叉树&#xff1b; 其实就是在二叉树的基础上&#xff0c;若树中每棵子树都满足其…

Win10玩游戏老是弹回桌面的解决方法

在Win10电脑中&#xff0c;用户不仅可以办公&#xff0c;也可以畅玩各种各样的游戏。但是&#xff0c;有时候用户在玩游戏的时候&#xff0c;遇到了游戏老是自己弹回桌面的问题&#xff0c;这样是非常影响游戏体验的&#xff0c;却不清楚具体的解决方法。下面小编给大家带来了简…

系统架构与Tomcat的安装和配置

2023.10.16 今天是学习javaweb的第一天&#xff0c;主要学习了系统架构的相关知识和原理&#xff0c;下载了web服务器软件&#xff1a;Tomcat&#xff0c;并对其进行了配置。 系统架构 包括&#xff1a;C/S架构 和 B/S架构。 C/S架构&#xff1a; Client / Server&#xff0…

OJ项目——统一数据格式返回,我是如何处理的?

目录 前言 OJ项目中是如何处理的 1、准备一个类&#xff0c;作为统一的数据返回格式 2、准备一个类&#xff0c;实现ResponseBodyAdvice接口 3、我们如何写返回值更好 4、进一步优化返回值 小结 前言 关于SpringBoot的同一功能处理&#xff0c;本博主在这篇博客已经有介…

React + Router

React Router 这个只是专门讲解 React Router 新开的例子。 教程来源&#xff1a;https://reactrouter.com/en/main/start/tutorial 创建新项目 yarn create vite my-react-router-app --template react-ts cd my-react-router-app yarn安装 React Router 依赖: yarn add…