基於socket實現大檔案上傳

2022-01-30 23:16:15 字數 2927 閱讀 2978

import socket

1.客戶端:

操作流程:

先拿到檔案--->獲取檔案大小---->建立字典

1.製作表頭

header  如何得到 他是乙個二進位制字串 

序列化得到 字典字串 ----》轉成二進位制字串---header_bytes》打包 header_len = struct.pack('i' , len(header_bytes)

2.傳送表頭 client.send(header)

3.傳送字典

client.send(header_bytfes)

4.傳送真實資訊

with open('檔案路徑『 ,「rb」) as f:

for line in f :

client.send(line)

詳情:

import socket

import struct

import json

import os

# 第一步:

client = socket.socket()

# 繫結位址

client.connect(('127.0.0.1', 8080))

# 檔案大小

file_size = os.path.getsize(r'd:\data\day32\大檔案上傳\基於socket 實現大檔案上傳\hashlib.mp4') # r' ' :表示原義字串

print(file_size)

# 命名

# 定義乙個字典

my_dict =

# 序列化字典

data_bytes = json.dumps(my_dict).encode('utf-8') # 目的一會要轉成字串入記憶體

print("123345")

print(data_bytes)

# 製作報頭

header = struct.pack('i', len(data_bytes)) # 限制檔案的大小

print(header) # b'\xbc\x00\x00\x00'

# 傳送報頭

client.send(header) # 客戶端傳送報頭資訊

# 傳送字典

client.send(data_bytes) # 提示以字典的形式接收

print(data_bytes)

# 開始傳送真實資訊 客戶需要的詳細資訊 傳送到服務端進行處理

with open('d:\data\day32\大檔案上傳\基於socket 實現大檔案上傳\hashlib.mp4', "rb")as f:

for line in f:

client.send(line)

2.服務端:

來吧:接收報頭---header》解析報頭 返回字典格式:1.報頭得到我的字典長度header = conn.recv(4)  ---->獲取 header_len = struct.unpack('i' , header)[0] -----> header_bytes = conn.recv(header_len)

header_dict= json.lods(header_bytes).decode('utf-8')

import os

import json

import socket

import struct

# 第一步

# ip_port = ('127.0.0.1', 8080)

# 可以寫縮寫上面的 試試吧

server = socket.socket()

server.bind(('127.0.0.1', 8080))

server.listen(5)

while true:

conn, addr = server.accept() # 等待接收資訊

while true:

try:

# 接收報頭

header = conn.recv(4)

# 解析報頭,獲取報頭長度

header_len = struct.unpack('i', header)[0]

print(header_len)

# 獲取 #b'{"file_name": "\\u6027\\u611f\\u5c0f\\u59d0\\u59d0\\u5728\\u7ebf\\u53d1\\u724c.mp4", "file_size": 205033304, "msg": "\\u6587

header_bytes = conn.recv(header_len)

print(header_bytes) # # 二進位制的字典的資訊

# 反序列化成字典

header_dic = json.loads(header_bytes.decode('utf-8'))

# 開始迴圈接收檔案傳到本地

file_name = header_dic.get("file_name")

file_size = header_dic.get("file_size")

recv_size = 0

with open(file_name, "wb")as f:

while recv_size < file_size:

data = conn.recv(1024)

f.write(data)

recv_size = recv_size+len(data)

# print(len(data))

# print(recv_size) #第一次接收的值

break

print(header_dic.get("msg")) # 字典點.get是他的內建方法

except connectionerror:

break

conn.close()

可以獲取檔案 獲取我們檔案的大小(規定傳的大小)

上傳大檔案 關於大檔案上傳

js計算檔案md5使用spark md5.js,據說這個庫使用的是世界上最快的md5演算法。js對檔案切片並使用ajax上傳切片 let size file.size 獲取檔案大小 const shardsize 1024 1024 塊大小1mb let shardcount math.ceil s...

PHP 大檔案上傳實現

這幾天正好學校的乙個專案要用到大檔案的上傳,上網查詢了一下關於大檔案的上傳處理,以下就是幾種解決方案 1.使用 php的創始人 rasmus lerdorf 寫的apc擴充套件模組來實現 apc實現方法 複製php內容到剪貼簿 php if server request method post el...

大檔案上傳

首先先要建好幾個檔案 html裡面 1238 9141589 90php裡面 1 2 username post username 3 1 接收前端傳過來的引數 4 ori file name post filename 原始檔案的檔名 5 file files file 6 tmp name fi...