需求:一个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攻克之路-网络编程(文件上传实现思路)相关推荐

  1. Web网络攻防文件上传。.

    Web网络攻防文件上传 上传漏洞靶场upload-labs安装 upload-labs 是由php 语言靶场,因此需要在PhpStudy下进行使用. 靶场文件下载:https://github.com ...

  2. python爬虫:Multipart/form-data POST文件上传详解

    简单的HTTP POST 大家通过HTTP向服务器发送POST请求提交数据,都是通过form表单提交的,代码如下: <form method="post"action=&qu ...

  3. python scoket、SocketServer简单实现文件上传下载

    2019独角兽企业重金招聘Python工程师标准>>> 1.描述 实现任何位置文件下载到客户端执行的当前目录下 实现任何位置文件上传到服务端执行的当前目录下服务端: #!/usr/b ...

  4. bottle 文件服务器,python bottle 框架基础教程:文件上传 | linux系统运维

    文件上传,需要注意的是前端html的form表单中,要添加 enctype="multipart/form-data"属性,否则无法上传文件.在后端,用request.files方 ...

  5. 【网络安全】文件上传绕过思路总结

    硬怼 [技术资料] 硬怼的话,主要是从下面这些方法入手去操作. (1)fuzz后缀名 看看有无漏网之鱼(针对开发自定义的过滤可能有机会,针对waf基本不可能.更多的情况是php的站寻找文件包含或者解析 ...

  6. ctf文件上传基本思路+例题

    目录 简介 一句话木马 蚁剑 例题 总结思路 附言 简介 文件上传本质上就是将文件传输到服务器时没有做好检测和过滤,导致可上传恶意程序到服务器,从而获得后台权限来干点坏事.一般这个恶意脚本文件称为we ...

  7. Rop 文件上传解决思路

    由于服务请求报文是一个文本,无法直接传送二进制的文件内容,因此必须采用某种 转换机制将二进制的文件内容转换为字符串.Rop 采用如下的方式对上传文件进行编码: <fileType>@< ...

  8. python flask上传文件_flask 文件上传(单文件上传、多文件上传)--

    文件上传 在HTML中,渲染一个文件上传字段只需要将标签的type属性设为file,即. 这会在浏览器中渲染成一个文件上传字段,单击文件选择按钮会打开文件选择窗口,选择对应的文件后,被选择的文件名会显 ...

  9. vue 文件及描述信息一起上传_用Vue实现一个大文件上传和断点续传

    前言 这段时间面试官都挺忙的,频频出现在博客文章标题,虽然我不是特别想蹭热度,但是实在想不到好的标题了-.-,蹭蹭就蹭蹭 :) 事实上我在面试的时候确实被问到了这个问题,而且是一道在线 coding ...

最新文章

  1. [CentOS7] 常用工具 之 差异备份工具 rdiff-backup
  2. Navicat连接Oracle数据库以及Oracle library is not loaded的解决方法
  3. zipkin server 数据持久化问题
  4. mysql修改字段名称_MySQL增删改查的常用语句汇总
  5. java 类编译_Java类编译、加载、和执行机制
  6. 关系型数据库(Relational Database)与非关系型数据库(NoSQL)的区别:(MySQL,Redis,Memcache,MongoDB)
  7. ar开发 ue4_UE4 和 ARKit 入门
  8. java dump 线程_Java 中怎么获取一份线程 dump 文件
  9. Python时钟代码——利用python turtle实现模拟时钟
  10. python随堂笔记(2)- globle全局变量的修改
  11. 网络与信息安全应急处置预案
  12. win7计算机时间同步出错,win7系统电脑时间同步出错的解决方法
  13. python计算个税
  14. java 变量 英文_java 变量(翻译自Java Tutorials)
  15. 网络分流器-TCP报文重组和会话规则-网络分流器
  16. java时间戳转换_Java编程实现时间和时间戳相互转换实例
  17. jeesite 框架搭建与配置(笔记)
  18. 小米笔记本Air 13.3 的键盘功能按键使用方式
  19. CTF每日一题之ACII码编码
  20. 07 list和dict for循环遍历索引问题以及深浅拷贝

热门文章

  1. 2002: [Hnoi2010]Bounce 弹飞绵羊
  2. CocoaPods的使用
  3. CIO实施精细化管理的五个要点
  4. 云计算将使IT人失业?惠普推云计算裁员九千!程序员如何面对即将到来的产业大调整?...
  5. ubuntu 启动时 设置多个ip 修改mac 网关 。。。
  6. 11.16-18 lsci、ipcs、ipcrm:清除ipc相关信息
  7. 怎么用c语言表示大整数的四则运算,用c语言编写大整数的四则运算,求大神
  8. win10怎么把c盘锁住_win10如何给c盘分区
  9. 历届试题 打印十字图(模拟)
  10. 阿里云数据中台 Quick Audience 智能用户增长正式发布