120 lines
4.0 KiB
Python
120 lines
4.0 KiB
Python
"""
|
||
Author : XinYi Song
|
||
Time : 2021/12/1 15:19
|
||
Desc:
|
||
"""
|
||
import socket
|
||
import sys
|
||
import re
|
||
import os
|
||
from hashlib import md5
|
||
import time
|
||
|
||
FILE_DIR = os.path.dirname(__file__)
|
||
|
||
# BASE_DIR = os.path.dirname(os.path.dirname(__file__))
|
||
# home = os.path.join(BASE_DIR, "/unstructured_data/remote_sensing_data")
|
||
home = "/unstructured_data/remote_sensing_data"
|
||
|
||
|
||
# 定义一个函数,计算进度条
|
||
def bar(num=1, sum=100):
|
||
rate = float(num) / float(sum)
|
||
rate_num = int(rate * 100)
|
||
temp = '\r%d %%' % (rate_num)
|
||
sys.stdout.write(temp)
|
||
|
||
|
||
def file_store_path(time_stamp):
|
||
"""
|
||
:param time_stamp: 时间戳类型时间
|
||
:return:
|
||
"""
|
||
now = int(round(time_stamp * 1000))
|
||
t = time.localtime(now / 1000)
|
||
return os.path.join('E:/data/upload', str(t[0]), str(t[1]), str(t[2]))
|
||
|
||
|
||
def file_store_path_year(data_str_time, upload_path, conllection_code):
|
||
"""
|
||
目录到年
|
||
:param upload_path:
|
||
:param data_str_time: 字符串类型
|
||
:return:
|
||
"""
|
||
t = time.strptime(data_str_time, '%Y-%m-%d %H:%M:%S')
|
||
return os.path.join(upload_path, conllection_code, str(t[0]))
|
||
|
||
|
||
def md5_file(name):
|
||
m = md5()
|
||
a_file = open(name, 'rb') # 需要使用二进制格式读取文件内容
|
||
m.update(a_file.read())
|
||
a_file.close()
|
||
return m.hexdigest()
|
||
|
||
|
||
def file_store_path_month(data_str_time, upload_path, conllection_code):
|
||
"""
|
||
目录到月
|
||
:param upload_path:
|
||
:param data_str_time:
|
||
:return:
|
||
"""
|
||
t = time.strptime(data_str_time, '%Y-%m-%d %H:%M:%S')
|
||
return os.path.join(upload_path, conllection_code, str(t[0]), str(t[1]))
|
||
|
||
|
||
def file_store_path_day(data_str_time, upload_path, conllection_code):
|
||
"""
|
||
目录到日
|
||
:param upload_path:
|
||
:param data_str_time: 字符串类型的时间
|
||
:return:
|
||
"""
|
||
t = time.strptime(data_str_time, '%Y-%m-%d %H:%M:%S')
|
||
return os.path.join(upload_path, conllection_code, str(t[0]), str(t[1]), str(t[2]))
|
||
|
||
|
||
def upload_file_client(file_path, depth, dateTime, collectionCode):
|
||
ck = socket.socket()
|
||
ck.connect(('192.168.2.9', 9002))
|
||
print(str(ck.recv(1024), encoding='utf-8'))
|
||
# inp = input('请输入(内容格式:post|文件路径 目标路径): \n >>> ').strip() # 输入内容格式:命令|文件路径 目标路径
|
||
# func, file_path = inp.split("|", 1) # 将输入的内容拆分为两部分,方法名和路径
|
||
# local_path, target_path = re.split("\s*", file_path, 1) #再将路径部分,通过正则表达式。以空格拆分为:文件路径和上传的目标路径
|
||
file_byte_size = os.stat(file_path).st_size # 获取文件的大小
|
||
file_name = os.path.basename(file_path) # 设置文件名
|
||
md5 = md5_file(file_path)
|
||
if depth == 'year':
|
||
file_paths = file_store_path_year(dateTime, home, collectionCode)
|
||
if depth == 'month':
|
||
file_paths = file_store_path_month(dateTime, home, collectionCode)
|
||
if depth == 'day':
|
||
file_paths = file_store_path_day(dateTime, home, collectionCode)
|
||
|
||
post_info = "post|%s|%s|%s|%s|%s" % (file_name, file_byte_size, collectionCode, dateTime, depth) # 将发送的内容进行拼接
|
||
ck.sendall(bytes(post_info, encoding='utf-8')) # 向服务器端发送内容
|
||
|
||
result_exist = str(ck.recv(1024), encoding='utf-8')
|
||
has_sent = 0
|
||
if result_exist == "2003":
|
||
ck.sendall(bytes("2004", encoding='utf-8'))
|
||
result_continue_pos = str(ck.recv(1024), encoding='utf-8') # 已经传输了多少的文件内容
|
||
print(result_continue_pos)
|
||
has_sent = int(result_continue_pos)
|
||
file_obj = open(file_path, 'rb') # 对文件进行读操作
|
||
file_obj.seek(has_sent) # 调整指针
|
||
|
||
while has_sent < file_byte_size:
|
||
data = file_obj.read(1024)
|
||
ck.sendall(data)
|
||
has_sent += len(data)
|
||
bar(has_sent, file_byte_size) # 进度条
|
||
|
||
file_obj.close()
|
||
print("文件上传成功!")
|
||
uc = {'file_size': file_byte_size, 'fileName': file_name, 'md5': md5, 'file_path': file_paths + '/' + file_name,
|
||
'type': 'ok'}
|
||
return uc
|