Python3的文件上傳

服務器端

import socket
import os

BASE_DIR = os.path.dirname(os.path.abspath(__file__))  # 獲取絕對路徑
sk = socket.socket()
address = ('127.0.0.1', 8000)  # 地址
sk.bind(address)  # 綁定
sk.listen(4)  # 監聽
while 1:
    conn, addr = sk.accept()  # 阻塞
    while 1:
        # 接收文件信息 並解析
        data = conn.recv(1024)
        cmd, filename, filesize = str(data, 'utf8').split('|')
        path = os.path.join(BASE_DIR, 'pic', filename)
        filesize = int(filesize)

        # 接收文件
        f = open(path, 'ab')
        has_receive = 0
        while has_receive != filesize:
            data = conn.recv(1024)
            f.write(data)
            has_receive += len(data)
        f.close()

sk.close()

客戶端

import socket
import os

sk = socket.socket()
address = ('127.0.0.1', 8000)
sk.connect(address)
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
while 1:
    # 發送文件信息
    inp = input('>>>').strip()
    cmd, path = inp.split('|')  # post socket.png
    path = os.path.join(BASE_DIR, path)  # 獲取絕對路徑 路徑與文件名拼接
    filename = os.path.basename(path)  # 獲取文件名
    file_size = os.stat(path).st_size  # 獲取文件大小
    file_info = 'post|%s|%s' % (filename, file_size)  # 字符串拼接 打包
    sk.sendall(bytes(file_info, 'utf8'))

    # 發送數據
    f = open(path, 'rb')  # 二進制格式讀取
    has_sent = 0  # 記錄已發送數據大小
    while has_sent != file_size:
        data = f.read(1024)  # 一段一段發
        sk.sendall(data)
        has_sent += len(data)  # 已發送數據大小累加
    f.close()
    print('post successful')

記得在上述文件同級目錄下新建一個文件夾pic用於接收文件

在客戶端運行端口輸入   'cmd|img.png'  其中cmd 爲post img.png爲上傳目標圖片,事前放進同級目錄下。也可以自己填文件路徑

例如:我的文件爲:socket.png

你也可以右鍵上圖另存爲socket.png 然後放進上面同級目錄下

然後運行服務器端和客戶端,在客戶端終端輸入  post|socket.png

如果提示post successful就完成文件上傳操作了。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章