From 05df024ddc6c94796d5a20902e4b41c8c6468732 Mon Sep 17 00:00:00 2001 From: XinYi Song <2037158277@qq.com> Date: Fri, 3 Dec 2021 17:33:02 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E6=B7=BB=E5=8A=A0=E4=BA=86=E6=96=AD?= =?UTF-8?q?=E7=82=B9=E7=BB=AD=E4=BC=A0=E6=9C=8D=E5=8A=A1=E7=AB=AF=EF=BC=8C?= =?UTF-8?q?=E7=94=A8socket=E5=BB=BA=E7=AB=8B=E8=BF=9E=E6=8E=A5=E9=80=9A?= =?UTF-8?q?=E9=81=93=202=E3=80=81=E4=BF=AE=E6=94=B9=E4=BA=86=E5=8A=A8?= =?UTF-8?q?=E6=80=81=E7=94=9F=E6=88=90=E5=AD=98=E5=82=A8=E8=B7=AF=E5=BE=84?= =?UTF-8?q?=E7=9A=84=E4=BB=A3=E7=A0=81=E6=A8=A1=E5=9D=97=203=E3=80=81?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BA=86=E6=89=AB=E6=8F=8F=E8=B7=AF=E5=BE=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- __pycache__/app.cpython-39.pyc | Bin 477 -> 494 bytes .../config/__pycache__/factory.cpython-39.pyc | Bin 791 -> 1262 bytes common/config/factory.py | 26 +++--- upload/__init__.py | 5 ++ upload/__pycache__/__init__.cpython-39.pyc | Bin 0 -> 205 bytes .../__pycache__/upload_client.cpython-39.pyc | Bin 0 -> 2021 bytes upload/upload_client.py | 80 ++++++++++++++++++ .../file_store_path.cpython-39.pyc | Bin 1620 -> 1650 bytes .../http_file_upload.cpython-39.pyc | Bin 1953 -> 1955 bytes .../__pycache__/scan_file_util.cpython-39.pyc | Bin 15999 -> 23608 bytes util/file_store_path.py | 12 +-- util/http_file_upload.py | 8 +- util/scan_file_util.py | 74 ++++++++++------ 13 files changed, 157 insertions(+), 48 deletions(-) create mode 100644 upload/__init__.py create mode 100644 upload/__pycache__/__init__.cpython-39.pyc create mode 100644 upload/__pycache__/upload_client.cpython-39.pyc create mode 100644 upload/upload_client.py diff --git a/__pycache__/app.cpython-39.pyc b/__pycache__/app.cpython-39.pyc index 06757f94139292dce0022f1f99f76520b6429a8d..dc204d474d3d469e6762e85b9760819e39741842 100644 GIT binary patch delta 67 zcmcc1{EnG7k(ZZ?0SNA#S(zv@kyn;6W}>#Aa6~Fw7FP;q3Rf>9BSQ*zFoPz~#Eyf! WncB(>44RC$SPJrsN+x?UP5}T?HxbhS delta 49 zcmaFIe3zLwk(ZZ?0SF@0mLzgdKH<51}mmrYm48+CrCZ5xcNa0T5NnuUlO<|wIlERn5 z4`d5~*@7uTK(;WLEs`P%WQ&2>;wchv^^z%4aJF=c42+%5nIb#!zbvENWLd_U98oM; z`ANoA%9HyUCB@y{jD20a;!`qi7mlR_{%6C)V@ rVZqPh#jEZl(_fbVEG}G(9E?T6lUFlYiV6cGs0b8ONQBVjpG_qGo^6PVP43{$WX$vfVGAJ z%3@o{z{pU;5X_*-Gr5p)=45x~c$p}U%)HE!_{4&OTdc(;iA5!vjJKG9yp;?^0+SCh r`!H%u=4Vmh{mJx~g`kf~MY;iB3TJF^Gc<7=auIATH(r5-AK(3@MDk44O<;W?YV?B^mie3JO*V z5t(_BnF_)AdFfmsnYpP7Kwza{WME{dZ)l`%tYBzpWoXXjl3JW>#pS2Tc#AzgJ|#an zK7J)b5fji*F!9U4#VRH(Gbc5sJijPArl1mNc3x#^VqR`yOiFHXOld(*equ^Ye0*kJ bW=VX!UP0w84x8Nkl+v73JCGAU12F>t5OXt+ literal 0 HcmV?d00001 diff --git a/upload/__pycache__/upload_client.cpython-39.pyc b/upload/__pycache__/upload_client.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..43cb636bdc44bd35fe65b3552b1e351fbc6a23ec GIT binary patch literal 2021 zcmaJ?&5ImG6tAlOn4X@G{mgD49tLEU5#7zKNlca?k;Fhi_Fz0{v(WT*)nf0uP{U02 zdV9UEqx74ocQ;G#xnD(z=t0}-?Oxm+>p2mdL|B_a(fS?DuJDB>ZyU zDA$joSopchr0~aq8u}9v$nxA-ZIY#GSgxH_^I&rF-cFI`N*19iq~JaeRInpOk|{7N z(mYDsN3U}bW)03LAjF`J>*n%f$19XFikF70Nq2?eWT-!wzZ`V4IVtQAZeO#|B_nP&HDc8RcGEbb$N5z(k^$w z+N=6JZ~f2twqm+nAz8t3+ES|!w>HGBqdW68-Kt{N($m-zC})^tfPK_0B^_t{Bn zaBX*caOLXu?)J6lgLesuFt<*uLLGf{6)5kBG|V^uMe7}`G(fY-SoF^WGqZ3cRM`l#G!-FGbS!JyDv3!Peg{_b(##bQx{)hC zN4sWa!#NC~$e?vhONn$U&0z*>%utEd1wIie58}AA4kt?FvWYtg0!#`qlAAa+Vv$z# zl;>gDUzS^_wYV6oq30ltLhLB+|U9wEeZR;rl!beP6zhN-PpkiiG?SCk;R|jHAOU=H7atqIkPbiGTmmRIz#! zCAm|5$0J$QCdaRF_?~n7&KIBix9)r?2Y3%w&^p%mq_=#4#ahw1#$A{L)w`sN!T TObcP)ug%t3+cXW=cAS3zO~DY` literal 0 HcmV?d00001 diff --git a/upload/upload_client.py b/upload/upload_client.py new file mode 100644 index 0000000..f339c23 --- /dev/null +++ b/upload/upload_client.py @@ -0,0 +1,80 @@ +""" +Author : XinYi Song +Time : 2021/12/1 15:19 +Desc: +""" +import socket +import sys +import re +import os +from hashlib import md5 + +from util.file_store_path import file_store_path_year, file_store_path_month, file_store_path_day + +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 md5_file(name): + m = md5() + a_file = open(name, 'rb') #需要使用二进制格式读取文件内容 + m.update(a_file.read()) + a_file.close() + return m.hexdigest() + + +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": + # inp = input("文件已存在,是否续传?Y/N:").strip() + # if inp.upper() == 'Y': + 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) + + # else: + # ck.sendall(bytes("2005", encoding='utf-8')) #发送2005代表不续传 + + 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 diff --git a/util/__pycache__/file_store_path.cpython-39.pyc b/util/__pycache__/file_store_path.cpython-39.pyc index c53f3ad0e22e98b91fb0d10817a1f9af56583890..a07dca298bb20ca600e13626a318de2194ae6f1b 100644 GIT binary patch delta 331 zcmcb@^NEKqk(ZZ?0SIodU71+Gxsk7sk%Q0GN3YdX38xT7Kaj_DRC}CK@ zSi_LQxR9xqse~zuc>zleV+m^wQwozLLo-lxau?GYS>`C-l*E$6_~MeH_>#=r)F|%K zf}H%sl=yc0g9RhO zUh12Tb=69;B+(#te{-Gv{hiFCYOZ`= zFd1dzANUWCz4~xsE%8d`vdrNr0uYqQP~o0qJ%T;A^y;1U$!93g1_o_N0fTW0$0}B3 z$YF&DjK^Q$~c__}3ga%4v>YE}`iY#|3@^ zt2rLw@GG@Xa0Bu$9#DIPKbH{dVU$farOr{h39GrY2pqm8hV;2^Q#c4m4>V(hbtfx>5J1%r41 delta 520 zcmZusO-my|5UuL@>gmbEkL-F_(34k*HzCJW`~?Bgiw<@qnq(4_5{Xpf;#@oiJc)uc z_y?4n_CM@-58f8`5BLwZM@9EwHIG*f?^V6JpDAYIB#sr>`n7eJ6p!%=E-h~~>IaA2 zR{gX;?9>NiYWLIeNs{)Gy6%mp-|;t|JEi5Vs+Oh2y2a=R0ubcLP~ed;4#AO=yXDWg zWus=WZd4w1L9cRV)h}KG|?m`!<|P)kn`hI~|zduxTUD>cE~9 zoh`G<=Qw(a71BIM8Loi|Ihx?;8`Umw3(_SQs5ZfI1EG9cn##7FbKKm9%~Y%c`|n1d zzLaY+fpGknzUnY5?+x;W!W!+WS9aNBhm=-2y7f%V@${z~;$n42b^H5CcXyCb`^nR- d0kwCePN>y9>|H&3*K-Ohs8CwG@$|-*_z$O8f{*|J diff --git a/util/__pycache__/scan_file_util.cpython-39.pyc b/util/__pycache__/scan_file_util.cpython-39.pyc index 25bb17fa8960bafeb65f246384f23e0644ee8608..0e3ac93a4b8b740fe29e82c615ee8a1055f47da1 100644 GIT binary patch literal 23608 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 F{{dWfd+`7O literal 15999 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 oMC=JTE~IP-!r>IVJFo+!N$$knkMiH