125 lines
4.4 KiB
Python
125 lines
4.4 KiB
Python
#!/usr/bin/python
|
|
|
|
import os, time, redis, piexif, oss2
|
|
from threading import Thread
|
|
from PIL import Image
|
|
from ftplib import FTP
|
|
|
|
def get_maxnum(path):
|
|
maxnum = 0
|
|
for file in os.listdir(path):
|
|
if len(file.split('_')) > 1:
|
|
num = int(file.split('_')[-1].split('.')[0])
|
|
else:
|
|
num = 1
|
|
|
|
if num > maxnum:
|
|
maxnum = num
|
|
print('最大文件序号: ' + str(maxnum))
|
|
return maxnum
|
|
|
|
def fix_exif(exif_dict):
|
|
exif_dict['Exif'][piexif.ExifIFD.MakerNote] = b''
|
|
exif_dict['Exif'][piexif.ExifIFD.UserComment] = b''
|
|
# exif_dict['0th'][piexif.ImageIFD.Make] = 'Huawei'
|
|
# exif_dict['0th'][piexif.ImageIFD.Model] = 'Nexus 6P'
|
|
# exif_dict['0th'][piexif.ImageIFD.Software] = 'sux V7'
|
|
exif_dict['0th'][piexif.ImageIFD.ImageWidth] = 4056
|
|
exif_dict['0th'][piexif.ImageIFD.ImageLength] = 3040
|
|
if exif_dict['Exif'].get(piexif.ExifIFD.DigitalZoomRatio, 'havenothiskey') != 'havenothiskey':
|
|
del(exif_dict['Exif'][piexif.ExifIFD.DigitalZoomRatio])
|
|
if exif_dict['Exif'].get(piexif.ExifIFD.FocalLengthIn35mmFilm, 'havenothiskey') != 'havenothiskey':
|
|
del(exif_dict['Exif'][piexif.ExifIFD.FocalLengthIn35mmFilm])
|
|
if not exif_dict['0th'].get(piexif.ImageIFD.Orientation) is None:
|
|
del(exif_dict['0th'][piexif.ImageIFD.Orientation])
|
|
|
|
exif_dict['GPS'] = {}
|
|
exif_bytes = piexif.dump(exif_dict)
|
|
return exif_bytes
|
|
|
|
def orientation_optimize(pathname, filename, pid, thread_num, ftp_client, orientation=180, optimize=80):
|
|
try:
|
|
img = Image.open(pathname)
|
|
exif = piexif.load(img.info['exif'])
|
|
exif_bytes = fix_exif(exif)
|
|
|
|
device_id = filename.split('_')[0]
|
|
index = filename.split('_')[-1].split('.')[0]
|
|
|
|
newfile = pathname.split('_')[0] + '_' + pathname.split('_')[-1]
|
|
|
|
img.rotate(orientation).save(newfile, optimize=True, quality=optimize, exif=exif_bytes)
|
|
print('Thread ' + thread_num + ': 照片预处理: ' + pathname + ' -> ' + newfile + ' 待处理队列:' + str(r.llen('photos_queue')))
|
|
os.remove(pathname)
|
|
|
|
for method in upload_methods:
|
|
if method == 'oss':
|
|
if index == '1':
|
|
photo = 'photos/' + pid + '/photo1/' + device_id + '_' + index + filename[-4:]
|
|
else:
|
|
photo = 'photos/' + pid + '/photo2/' + device_id + '_' + index + filename[-4:]
|
|
oss_client.put_object_from_file(photo, newfile)
|
|
elif method == 'ftp':
|
|
ftp_client.storbinary('STOR ' + filename, open(newfile, 'rb'))
|
|
elif method == 'ssh':
|
|
os.system('scp ' + newfile + ' ' + ssh_host + ':Downloads/' + pid + '/')
|
|
else:
|
|
pass
|
|
|
|
# os.remove(newfile)
|
|
|
|
except Exception as e:
|
|
print(e)
|
|
# 如果文件存在删除它
|
|
if os.path.exists(pathname): os.remove(pathname)
|
|
|
|
def process_photos(thread_num):
|
|
while True:
|
|
pathname = r.lpop('photos_queue')
|
|
if pathname is None:
|
|
time.sleep(1)
|
|
continue
|
|
pathname = pathname.decode()
|
|
filename = pathname.split('/')[-1]
|
|
pid = pathname.split('/')[-2]
|
|
if pid not in ds:
|
|
for method in upload_methods:
|
|
if method == 'oss':
|
|
pass
|
|
elif method == 'ftp':
|
|
try:
|
|
ftp_client.mkd(pid)
|
|
except Exception as e:
|
|
print(e)
|
|
ftp_client.cwd(pid)
|
|
elif method == 'ssh':
|
|
os.system('ssh ' + ssh_host + ' "mkdir -p Downloads/' + pid + '"')
|
|
else:
|
|
pass
|
|
ds[pid] = {}
|
|
|
|
orientation_optimize(pathname, filename, pid, thread_num, ftp_client)
|
|
|
|
if __name__ == '__main__':
|
|
ds = {}
|
|
r = redis.Redis(host='127.0.0.1', port=6379, db=0)
|
|
|
|
ftp_client = FTP('192.168.88.177', 'photo', 'ph2008')
|
|
|
|
ssh_host = 'ds'
|
|
|
|
AccessKeyId = 'LTAI5tSReWm8hz7dSYxxth8f'
|
|
AccessKeySecret = '8ywTDF9upPAtvgXtLKALY2iMYHIxdS'
|
|
Endpoint = 'oss-cn-shanghai.aliyuncs.com'
|
|
Bucket = 'suwa3d-securedata'
|
|
oss_client = oss2.Bucket(oss2.Auth(AccessKeyId, AccessKeySecret), Endpoint, Bucket)
|
|
|
|
upload_methods = ('oss', '')
|
|
|
|
threads = []
|
|
thread_nums = 5
|
|
for i in range(thread_nums):
|
|
t = Thread(target=process_photos, args=(str(i)))
|
|
threads.append(t)
|
|
t.start()
|