Python攻克之路-网络编程(文件上传实现思路)
需求:一个server,一个client,实现client把某个文件传到server中某个目录中
分析:实际是实现数据传输,设定一个命令和一个参数(上传的内容),连接后,让用户输入命令和要传送的内容,如post 2.png,先解析这个命令,找到2.png发送到server端,命令格式自定义
1. server,client基本连接框架
[root@node2 file_upload]# cat post_server.py
#!/usr/local/python3/bin/python3
import socket
import subprocess
sk = socket.socket()
address=('127.0.0.1',8888)
sk.bind(address)
sk.listen(3)
print('waiting...')while True:conn, addr = sk.accept()while True:
sk.close()
inp需要有用户输入
[root@node2 file_upload]# cat post_client.py
#!/usr/local/python3/bin/python3
import socket
import os
sk=socket.socket()
address=('127.0.0.1',8888)
sk.connect(address)while True:inp=input('>>> ') # post | pathsk.close()
2.建立连接后,post_client.py先发起动作,制定上传命令的格式post|2.png,通过|来分隔查找
a.需要一个base_dir,因为并不知道路径在那里,只知道在当前路径下,client.py的上一层就file_upload目录,再加2.png就可以,使用BASE_DIR与2.png这个内容(相对路径)进行拼接就可以了
BASE_DIR=os.path.dirname(os.path.abspath(__file__))
b.解析命令
cmd,path=inp.split('|')
c.拼接路径,使用join都可以使用相关平台的默认方式拼接(linux/windows),同时赋变量path
path=os.path.join(BASE_DIR,path)
d.需要文件的名字,2.png是一个名字,但是也可以在某个目录下,如post|reid/2.png,要与base_dir拼接才是一个绝对路径,filename是要让服务器知道它重新写的文件的名称,server与client的文件名要统一,所以要把名称通知server端
filename=os.path.basename(path) #参数是路径,可以取到文件名字
e.需要文件大小,通知server要接收文件的大小
file_size=os.stat(path).st_size
f.把内容打成一个包传输过去,还可以实现把文件存储在那个位置,没有可以创建目录,命令post,再加相应的内容,server端接收这种信息后,进行解释
file_info='post|%s|%s'%(filename,file_size)
g.把数据包传送到server
sk.sendall(bytes(file_info,'utf8'))
3. post_server到post_client内容进行接收
a. 接收数据
data=conn.recv(1024)
b.对数据解释,分配三个变量来解释
cmd,filename,filesze=str(data,'utf8').split('|')
c.加入相应的BASE_DIR,拼接路径
import os
BASE_DIR=os.path.dirname(os.path.abspath(__file__))while True:conn, addr = sk.accept()while True:data=conn.recv(1024)cmd,filename,filesze=str(data,'utf8').split('|')path=os.path.join(BASE_DIR,'storage',filename) ######storage已经固定,可以传过来后再拼接,BASE_DIR是当前文件的上级,storage同一路径的目录,filename文件名
d.把字符串类型的filesize转换成int类型
filesze=int(filesze)
4.post_client开始发送数据
a.打开文件,rb以bytes类型读,不加是以字符串的类型读
f=open(path,'rb')
b.读取文件,read是全部读取的,定义一次1024字节大小,发送一段段的发
data=f.read(1024)
c.判断什么时候把数据发完
has_sent=0 #初始化发送的大小,has_sent已经发过去的内容,不能设置byteswhile has_sent!=file_size: #filez_size是int类型,has_sent也是data=f.read(1024) #读数据sk.sendall(data) #发送到serverhas_sent+=len(data) #累加的是data的长度,has_sent是一个int整型,如果累加1024就要是它的倍数,有可能不是f.close() print('upload success')
5.post_server进行接收数据
a.打开文件
f=open(path,'ab')
b.循环接收
has_received=0 while has_received!=filesze: data=conn.recv(1024) #data是bytes类型f.write(data) #直接写has_received+=len(data)f.close()
6.完整代码
[root@node2 file_upload]# cat post_client.py
1 #!/usr/local/python3/bin/python3 2 import socket 3 import os 4 sk=socket.socket() 5 address=('127.0.0.1',8888) 6 sk.connect(address) 7 8 BASE_DIR=os.path.dirname(os.path.abspath(__file__)) 9 10 while True: 11 inp=input('>>> ').strip() # post | path 12 cmd,path=inp.split('|') 13 path=os.path.join(BASE_DIR,path) 14 filename=os.path.basename(path) 15 file_size=os.stat(path).st_size 16 file_info='post|%s|%s'%(filename,file_size) 17 sk.sendall(bytes(file_info,'utf8')) 18 19 f=open(path,'rb') 20 data=f.read(1024) 21 22 has_sent=0 23 while has_sent!=file_size: 24 data=f.read(1024) 25 sk.sendall(data) 26 has_sent+=len(data) 27 f.close() 28 print('upload success') 29 30 sk.close()
View Code
[root@node2 file_upload]# cat post_server.py
1 #!/usr/local/python3/bin/python3 2 import socket 3 import subprocess 4 import os 5 # family type 6 sk = socket.socket() 7 address=('127.0.0.1',8888) 8 sk.bind(address) 9 sk.listen(3) 10 BASE_DIR=os.path.dirname(os.path.abspath(__file__)) 11 12 while True: 13 conn, addr = sk.accept() 14 while True: 15 data=conn.recv(1024) 16 cmd,filename,filesze=str(data,'utf8').split('|') 17 path=os.path.join(BASE_DIR,'file_upload',filename) 18 filesze=int(filesze) 19 20 f=open(path,'ab') 21 has_received=0 22 while has_received!=filesze: 23 data=conn.recv(1024) 24 f.write(data) 25 has_received+=len(data) 26 f.close() 27 28 sk.close()
View Code
7.测试
[root@node2 file_upload]# python3 post_server.py
waiting...
[root@node2 file_upload]# python3 post_client.py
>>> post|2.png
[root@node2 py]# tree file_upload/
file_upload/
├── 2.png
├── post_client.py
├── post_server.py
└── storage└── 2.png
转载于:https://www.cnblogs.com/reid21/articles/9034972.html
Python攻克之路-网络编程(文件上传实现思路)相关推荐
- Web网络攻防文件上传。.
Web网络攻防文件上传 上传漏洞靶场upload-labs安装 upload-labs 是由php 语言靶场,因此需要在PhpStudy下进行使用. 靶场文件下载:https://github.com ...
- python爬虫:Multipart/form-data POST文件上传详解
简单的HTTP POST 大家通过HTTP向服务器发送POST请求提交数据,都是通过form表单提交的,代码如下: <form method="post"action=&qu ...
- python scoket、SocketServer简单实现文件上传下载
2019独角兽企业重金招聘Python工程师标准>>> 1.描述 实现任何位置文件下载到客户端执行的当前目录下 实现任何位置文件上传到服务端执行的当前目录下服务端: #!/usr/b ...
- bottle 文件服务器,python bottle 框架基础教程:文件上传 | linux系统运维
文件上传,需要注意的是前端html的form表单中,要添加 enctype="multipart/form-data"属性,否则无法上传文件.在后端,用request.files方 ...
- 【网络安全】文件上传绕过思路总结
硬怼 [技术资料] 硬怼的话,主要是从下面这些方法入手去操作. (1)fuzz后缀名 看看有无漏网之鱼(针对开发自定义的过滤可能有机会,针对waf基本不可能.更多的情况是php的站寻找文件包含或者解析 ...
- ctf文件上传基本思路+例题
目录 简介 一句话木马 蚁剑 例题 总结思路 附言 简介 文件上传本质上就是将文件传输到服务器时没有做好检测和过滤,导致可上传恶意程序到服务器,从而获得后台权限来干点坏事.一般这个恶意脚本文件称为we ...
- Rop 文件上传解决思路
由于服务请求报文是一个文本,无法直接传送二进制的文件内容,因此必须采用某种 转换机制将二进制的文件内容转换为字符串.Rop 采用如下的方式对上传文件进行编码: <fileType>@< ...
- python flask上传文件_flask 文件上传(单文件上传、多文件上传)--
文件上传 在HTML中,渲染一个文件上传字段只需要将标签的type属性设为file,即. 这会在浏览器中渲染成一个文件上传字段,单击文件选择按钮会打开文件选择窗口,选择对应的文件后,被选择的文件名会显 ...
- vue 文件及描述信息一起上传_用Vue实现一个大文件上传和断点续传
前言 这段时间面试官都挺忙的,频频出现在博客文章标题,虽然我不是特别想蹭热度,但是实在想不到好的标题了-.-,蹭蹭就蹭蹭 :) 事实上我在面试的时候确实被问到了这个问题,而且是一道在线 coding ...
最新文章
- [CentOS7] 常用工具 之 差异备份工具 rdiff-backup
- Navicat连接Oracle数据库以及Oracle library is not loaded的解决方法
- zipkin server 数据持久化问题
- mysql修改字段名称_MySQL增删改查的常用语句汇总
- java 类编译_Java类编译、加载、和执行机制
- 关系型数据库(Relational Database)与非关系型数据库(NoSQL)的区别:(MySQL,Redis,Memcache,MongoDB)
- ar开发 ue4_UE4 和 ARKit 入门
- java dump 线程_Java 中怎么获取一份线程 dump 文件
- Python时钟代码——利用python turtle实现模拟时钟
- python随堂笔记(2)- globle全局变量的修改
- 网络与信息安全应急处置预案
- win7计算机时间同步出错,win7系统电脑时间同步出错的解决方法
- python计算个税
- java 变量 英文_java 变量(翻译自Java Tutorials)
- 网络分流器-TCP报文重组和会话规则-网络分流器
- java时间戳转换_Java编程实现时间和时间戳相互转换实例
- jeesite 框架搭建与配置(笔记)
- 小米笔记本Air 13.3 的键盘功能按键使用方式
- CTF每日一题之ACII码编码
- 07 list和dict for循环遍历索引问题以及深浅拷贝
热门文章
- 2002: [Hnoi2010]Bounce 弹飞绵羊
- CocoaPods的使用
- CIO实施精细化管理的五个要点
- 云计算将使IT人失业?惠普推云计算裁员九千!程序员如何面对即将到来的产业大调整?...
- ubuntu 启动时 设置多个ip 修改mac 网关 。。。
- 11.16-18 lsci、ipcs、ipcrm:清除ipc相关信息
- 怎么用c语言表示大整数的四则运算,用c语言编写大整数的四则运算,求大神
- win10怎么把c盘锁住_win10如何给c盘分区
- 历届试题 打印十字图(模拟)
- 阿里云数据中台 Quick Audience 智能用户增长正式发布