接下来我来详细讲解"Python Tornado批量上传图片并显示功能"的完整攻略。
问题陈述
在开发Web应用程序过程中,经常需要实现批量上传图片的功能。本篇攻略将介绍如何使用Python Tornado框架实现此功能。
实现步骤
步骤一:HTML表单
首先,我们需要在前端编写HTML表单,用于选择多个图片文件并发送到服务器。
下面是一个示例HTML表单,使用<input type="file" multiple>
属性实现文件选择功能:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>批量上传图片</title>
</head>
<body>
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" name="files" multiple>
<input type="submit" value="上传">
</form>
</body>
</html>
步骤二:Python Tornado路由
接下来,我们需要在Python Tornado中编写路由,来接收前端发来的图片文件并批量上传。
import tornado.ioloop
import tornado.web
import os
class UploadHandler(tornado.web.RequestHandler):
def post(self):
files = self.request.files.get('files')
for file in files:
filename = file['filename']
body = file['body']
# 自定义存储路径和文件名
savePath = os.path.join(os.path.abspath('.'), 'upload/') # 存储路径
if not os.path.exists(savePath):
os.makedirs(savePath)
filePath = os.path.join(savePath, filename) # 文件名
with open(filePath, 'wb') as f:
f.write(body)
self.write('上传成功.')
if __name__ == "__main__":
app = tornado.web.Application([
(r"/upload", UploadHandler),
])
app.listen(8888)
tornado.ioloop.IOLoop.current().start()
在上述代码中,我们首先使用RequestHandler类处理路由请求,使用self.request.files.get('files')方法获取上传的图片文件列表。然后,对于每一个文件,我们可以获取其文件名和二进制内容,并自定义存储路径和文件名进行保存。
步骤三:HTML页面显示上传的图片
最后,我们需要在前端编写HTML页面,显示上传成功的图片。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>批量上传图片</title>
</head>
<body>
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" name="files" multiple>
<input type="submit" value="上传">
</form>
<div>
{% for file in files %}
<img src="{{ file }}" alt="图片">
{% end %}
</div>
</body>
</html>
在上述HTML页面中,我们使用Tornado模板引擎,遍历上传成功的图片文件路径列表,并使用img标签显示每一张图片。
示例说明
示例一:显示上传成功的图片
在成功上传图片后,我们可以使用Tornado的render方法,将上传成功的图片展示在HTML页面中。下面是一个实现此功能的示例代码:
import tornado.ioloop
import tornado.web
import os
class UploadHandler(tornado.web.RequestHandler):
def post(self):
files = self.request.files.get('files')
for file in files:
filename = file['filename']
body = file['body']
# 自定义存储路径和文件名
savePath = os.path.join(os.path.abspath('.'), 'upload/') # 存储路径
if not os.path.exists(savePath):
os.makedirs(savePath)
filePath = os.path.join(savePath, filename) # 文件名
with open(filePath, 'wb') as f:
f.write(body)
# 获取上传成功的图片文件路径列表
filesPath = []
for filename in os.listdir(savePath):
filesPath.append('/upload/' + filename)
self.render('success.html', files=filesPath)
if __name__ == "__main__":
app = tornado.web.Application([
(r"/upload", UploadHandler),
(r"/upload/(.*)", tornado.web.StaticFileHandler, {'path': './upload'}),
], template_path='templates')
app.listen(8888)
tornado.ioloop.IOLoop.current().start()
在上述代码中,我们使用self.render方法将上传成功的图片文件路径列表渲染到success.html页面中,使用自定义路径'/upload'来显示图片。
示例二:上传图片时限制文件类型和大小
在实际应用中,我们需要限制上传的图片文件类型和大小,以便确保服务器的安全性和文件存储效率。下面是一个实现此功能的示例代码:
import tornado.ioloop
import tornado.web
import os
class UploadHandler(tornado.web.RequestHandler):
def post(self):
files = self.request.files.get('files')
for file in files:
filename = file['filename']
body = file['body']
# 限制上传文件类型和大小
fileExt = os.path.splitext(filename)[-1].lower()
if fileExt not in ('.jpg', '.jpeg', '.png'):
self.write('只支持上传.jpg .jpeg .png格式的图片')
return
maxSize = 1024 * 1024 * 5 # 5M
if len(body) > maxSize:
self.write('上传文件大小不能超过5M')
return
# 自定义存储路径和文件名
savePath = os.path.join(os.path.abspath('.'), 'upload/') # 存储路径
if not os.path.exists(savePath):
os.makedirs(savePath)
filePath = os.path.join(savePath, filename) # 文件名
with open(filePath, 'wb') as f:
f.write(body)
# 获取上传成功的图片文件路径列表
filesPath = []
for filename in os.listdir(savePath):
filesPath.append('/upload/' + filename)
self.render('success.html', files=filesPath)
if __name__ == "__main__":
app = tornado.web.Application([
(r"/upload", UploadHandler),
(r"/upload/(.*)", tornado.web.StaticFileHandler, {'path': './upload'}),
], template_path='templates')
app.listen(8888)
tornado.ioloop.IOLoop.current().start()
在上述代码中,我们使用os.path.splitext方法获取上传文件的扩展名,并判断其是否在允许上传的文件类型之内。另外,我们使用maxSize变量限制上传文件的大小,如果超出限制则进行提示。最后,我们在获取上传成功的图片文件路径列表之前,对于每一个文件都进行了判断。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python Tornado批量上传图片并显示功能 - Python技术站