tornado 相关说明
改善图片上传功能 ,生成唯一的 ID ,与路径拼接,生成 URL,
这里引用 uuid 的 python 库
在 photo.py 中创建个类,用来 辅助用户上传的图片,生成相关缩略图,记录图片相关 URL ,并保存到数据库
把用户上传图片,生成缩略图,URL,保存信息到数据库放进一个类里,
class UploadImg:
"""
辅助用户上传的图片,生成相关缩略图,记录图片相关 URL ,并保存到数据库
"""
upload_dir = 'uploads'
thumb_dir = 'thumb'
size = (200,200)
def __init__(self, old_name, static_path):
self.old_name = old_name
self.static_path = static_path
self.name = self.get_new_name()
def get_new_name(self):
'''
生成一个唯一的字符串,用来做图片保存的字句
:return:
'''
# 拿到图片名的后缀
_, ext = os.path.splitext(self.old_name)
# 返回 16 位字符串, 生成新名字
return uuid.uuid4().hex + ext
@property
def upload_url(self):
'''
用来保存图片相对路径的 url
:return:
'''
return os.path.join(self.upload_dir, self.name)
@property
def upload_path(self):
'''
保存图片的文件路径
:return:
'''
return os.path.join(self.static_path, self.upload_url)
def save_upload(self, content):
"""图片上传,保存"""
save_to = self.upload_path
with open(self.upload_path, 'wb') as fh:
# 把文件内容写到指定文件路径中
fh.write(content)
@property
def thumb_url(self):
'''
生成用来保存缩略图相关路径的 url
:return:
'''
_, ext = os.path.splitext(self.old_name)
thumb_name = '{}_{}X{}{}'.format(self.name, self.size[0], self.size[1], ext)
return os.path.join(self.upload_dir,
self.thumb_dir,
thumb_name)
def save_thumb(self):
"""生成缩略图"""
# PIL 要操作的文件路径,
im = Image.open(self.upload_path)
# 缩略图生成
im.thumbnail(self.size)
# 保存缩略图
# 分离文件名和扩展名
im.save(os.path.join(self.static_path, self.thumb_url))