def upload_file(up_file, domain, ext_types=('png', 'jpeg', 'gif', 'bmp', 'jpg')):
if up_file:
date_path = date.strftime(date.today(), "%Y/%m/%d")
uid = uuid.UUID.time_low.fget(uuid.uuid4()) # 生成一段随机的数字
folder = domain+"/"+str(date_path)
ext = up_file.name.split(".")[-1] # 暂时未考虑 tar.gz 这样的后缀
if ext in ext_types:
file_uid = str(uid)
path_root = settings.MEDIA_ROOT
path_folder = path_root + folder
if not os.path.exists(path_folder):
os.makedirs(path_folder)
# 保存文件到服务器的完整路径
file_upload = path_folder + "/" + file_uid + "." + ext
# 保存在DB中的文件信息:文件路径,文件尺寸(若有),文件大小
file_info = folder + "/" + file_uid + "." + ext
try:
if ext in ('png', 'jpeg', 'gif', 'bmp', 'jpg'):
parser = ImageFile.Parser()
for chunk in up_file.chunks():
parser.feed(chunk)
img = parser.close()
# 原先的上传图片存在透明图片上传之后透明部分变黑的问题,已做修改
# img.convert('RGB').save(file_upload, format="JPEG", quality=85)
img.convert('RGBA').save(file_upload, format="PNG", quality=85)
else:
with open(file_upload, 'wb') as fd:
for chunk in up_file.chunks():
fd.write(chunk)
except Exception as e:
LOG.error(u"上传失败!%s", e)
return UPLOAD_FAIL, "上传失败!"
# 获取文件大小
if ext in ('png', 'jpeg', 'gif', 'bmp', 'jpg'):
image = Image.open(file_upload)
src_w, src_h = image.size
file_info += ","+str(src_w)+"_"+str(src_h)
else:
file_info += ",0_0"
file_size = os.path.getsize(file_upload)
file_info += ","+str(file_size)
return UPLOAD_SUCCESS, file_info
else:
return NOT_SUPPORT, """不是支持的文件类型!"""
else:
return NO_FILE, """未上传文件"""