利用tornado实现表格文件预览
项目介绍
本文将介绍笔者的一个项目,主要是利用tornado实现表格文件的预览,能够浏览的表格文件支持CSV以及Excel文件。预览的界面如下:

下面我们将看到这个功能是如何通过tornado来实现的。
代码
该项目的代码结构如下图所示:

其中主要分为四个部分:
- files
- static
- templates
- py代码
其中,files文件夹为上传的表格文件的存放路径,static为前端的静态文件,后续将不用给出介绍,读者可以从该项目的github中下载(下载地址详见后面),templates文件夹主要存放HTML文件,而py文件用于后端控制。
首先让我们看三个HTML文件,先是upload.html,其代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>文件上传</title>
<link rel="shortcut icon" href="{{static_url('images/flower.ico')}}">
<link rel="stylesheet" href="{{static_url('CSS/amazeui.min.css')}}">
<script src="{{static_url('JS/amazeui.min.js')}}"></script>
<script>
$(function() {
$('#doc-form-file').on('change', function() {
var fileNames = '';
$.each(this.files, function() {
fileNames += '<span class="am-badge">' + this.name + '</span> ';
});
$('#file-list').html(fileNames);
});
});
</script>
</head>
<body>
<div align="center">
<br><br>
<h1>表格文件上传</h1>
<form action='file' enctype="multipart/form-data" method='post'>
<div class="am-form-group am-form-file">
<button type="button" class="am-btn am-btn-primary am-btn-sm">选择要上传的文件</button>
<input id="doc-form-file" type="file" name="file" multiple>
</div>
<div id="file-list"></div>
<p>
<button type="submit" class="am-btn am-btn-default">提交</button>
</p>
</form>
<p><a href="/file_review"><button class="am-btn am-btn-danger">查看全部文件</button></a></p>
</div>
</body>
</html>
这个是文件上传的网页,界面如下:

选择上传文件,完成上传后,则会显示如下界面:

接着是fileReview.html,其代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>文件浏览</title>
<link rel="shortcut icon" href="{{static_url('images/flower.ico')}}">
<link rel="stylesheet" href="{{static_url('CSS/bootstrap.min.css')}}">
<link rel="stylesheet" href="{{static_url('CSS/amazeui.min.css')}}">
</head>
<body>
<div align="center">
<br><br>
<h1>文件浏览</h1>
<ul class="list-group" style="width:800px;text-align:left">
{% for file in files %}
{% if file.endswith('.csv') or file.endswith('.xls') or file.endswith('.xlsx') %}
<li class="list-group-item"> <a href={{"/data?file="+file}}>{{ file }}</a></li>
{% end %}
{% end %}
</ul>
<a href="/file"><button class="btn btn-success" id="review">文件上传界面</button></a>
</div>
</body>
</html>
该页面主要用于显示上传的表格文件,界面如下:

最后是dataReview.html,代码如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>数据预览</title>
<link rel="shortcut icon" href="{{static_url('images/flower.ico')}}">
<link rel="stylesheet" href="{{static_url('CSS/table.css')}}">
<link rel="stylesheet" href="{{static_url('CSS/bootstrap.min.css')}}">
</head>
<body>
<br><br>
<div align="center">
<div style="width:800px">
<table class="table table-striped table-bordered table-condensed table-responsive">
<thead id="index">
<tr>
{% for title in data[0] %}
<th>{{ title }}</th>
{% end %}
</tr>
</thead>
<tbody id="body">
{% for line in data[1:] %}
<tr>
{% for cell in line %}
<td>{{ cell }}</td>
{% end %}
</tr>
{% end %}
</tbody>
</table>
</div>
<a href="/file"><button class="btn btn-warning" id="review">文件上传界面</button></a>
</div>
</body>
</html>
该界面主要用于显示表格文件中的数据,比如刚才上传成功的Excel文件,其中的数据如下:

仅有HTML页面是不够的,我们还需要Python代码来控制网页的运行,这就是server.py,其中的代码如下:
# -*- coding: utf-8 -*-
import xlrd
import os.path
import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
from tornado.options import define, options
#定义端口为12306
define("port", default=12306, help="run on the given port", type=int)
class UploadFileHandler(tornado.web.RequestHandler):
# get函数
def get(self):
self.render('upload.html')
# post函数
def post(self):
# 文件的存放路径
upload_path = os.path.join(os.path.dirname(__file__), 'files')
# 提取表单中‘name’为‘file’的文件元数据
file_metas = self.request.files['file']
for meta in file_metas:
filename = meta['filename']
filepath = os.path.join(upload_path, filename)
# 有些文件需要已二进制的形式存储,实际中可以更改
with open(filepath, 'wb') as up:
up.write(meta['body'])
self.write("<br><br>")
self.write('<p>上传%s成功!</p>' % filename)
self.write('<p><a href="/file_review"><button>查看全部文件</button></a></p>')
class FileReviewHandler(tornado.web.RequestHandler):
def get(self):
# 文件的存放路径
upload_path = os.path.join(os.path.dirname(__file__), 'files')
files = os.listdir(upload_path)
for file in files:
if os.path.isdir(file):
files.remove(file)
self.render('fileReview.html', files=files)
class DataReviewHandler(tornado.web.RequestHandler):
def get(self):
filename = self.get_argument('file')
print(filename)
# 文件的存放路径
upload_path = os.path.join(os.path.dirname(__file__), 'files')
file_path = os.path.join(upload_path, filename)
if filename.endswith('.csv'):
with open(file_path, "r") as f:
data = f.readlines()
data = [line.strip().split(',') for line in data]
elif filename.endswith('.xls') or filename.endswith('.xlsx'):
tables = xlrd.open_workbook(file_path)
table = tables.sheets()[0] # 第一张表格
nrows = table.nrows
# 循环行列表数据
data = []
for i in range(nrows):
data.append(table.row_values(i))
else:
data = []
self.render('dataReview.html', data=data)
# 主函数
def main():
# 开启tornado服务
tornado.options.parse_command_line()
# 定义app
app = tornado.web.Application(
handlers=[(r'/file', UploadFileHandler),
(r'/file_review', FileReviewHandler),
(r'/data', DataReviewHandler)
], # 网页路径控制
template_path=os.path.join(os.path.dirname(__file__), "templates"), # 模板路径
static_path=os.path.join(os.path.dirname(__file__), "static"), # 配置静态文件路径
)
http_server = tornado.httpserver.HTTPServer(app)
http_server.listen(options.port)
tornado.ioloop.IOLoop.instance().start()
main()
点击运行server.py文件,在浏览中输入“localhost:12306/file”就能看到刚才的文件上传的页面了。
到此,我们就讲完了这个项目的结构,我们省去了static文件的讲述,因为这并不影响程序的运行,只是页面的样式会比较丑陋,如果您想获得较好的浏览效果,可以从该项目的github地址中下载static文件夹,不必再自己重头写起。
使用
笔者提供了以下三种方式供读者使用该项目:
- 直接使用
- github使用
- docker使用
直接使用
读者按照上面的讲解,自己写一个项目,拷贝static文件夹,然后点击运行server.py,在浏览中输入“localhost:12306/file”就能使用该程序来浏览上传的表格了。
github使用
从该项目的github地址:https://github.com/percent4/csv_file_review 中下载该项目,命令如下:
git init
git clone https://github.com/percent4/csv_file_review
然后安装必要的第三方模块:xlrd, tornado, 点击运行server.py,在浏览中输入“localhost:12306/file”就能使用该程序来浏览上传的表格了。
docker使用
首先拉取docker镜像:
docker pull jclian91/dockertest:csv_file_review.2019.02.21.2312
然后运行该镜像:
docker run -p 12306:12306 -v $PWD/db:/root/csv_file_review/src/files -it c97f252cd6e8 bash
注意, -it后面为刚才拉取的docker镜像的ID,需要将ID替换为你刚拉取的镜像ID,运行端口为本机的12306,上传的表格数据存放在$PWD/db路径下。进入虚拟机后,运行server.py即可启动服务,
[root@fbb2c3fb6ce1 src]# ls
__init__.py files server.py static templates
[root@fbb2c3fb6ce1 src]# python server.py
在浏览中输入“localhost:12306/file”就能使用该程序来浏览上传的表格了。
总结
关于本项目的介绍就到这儿了,感谢大家阅读~
如您对本项目的源代码感兴趣,可参考网址:https://github.com/percent4/csv_file_review
注意:本人现已开通微信公众号: Python爬虫与算法(微信号为:easy_web_scrape), 欢迎大家关注哦~~
利用tornado实现表格文件预览的更多相关文章
- java实现office文件预览
不知觉就过了这个久了,继上篇java实现文件上传下载后,今天给大家分享一篇java实现的对office文件预览功能. 相信大家在平常的项目中会遇到需要对文件实现预览功能,这里不用下载节省很多事.大家请 ...
- Qt SD卡 文件系统挂载、文件预览
/********************************************************************************** * Qt SD卡 文件系统挂载. ...
- Jquery.Treeview+Jquery UI制作Web文件预览
效果图: 前台Html: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="D ...
- Vue PDF文件预览vue-pdf
最近做项目,遇到预览PDF这个功能,在网上找了找,大多推荐的是pdf.js,不过在Vue中还是想偷懒直接npm组件,最后找到了一个还不错的Vue-pdf 组件,GitHub地址:https:// ...
- 关于pc端 app端pdf,word xls等文件预览的功能
第一种用H5标签<iframe>标签实现 返回的文件类型,文件流,文件流返回必须在设置 contentType对应的Mime Type, 返回文件的物理位置. 已经实测可以支持的文件类型 ...
- 利用iterm2,在命令行预览图片,服务器也是可以的
1.首先你本地电脑上要安装iterm2软件,我们这里使用brew安装 这个是一定要装的,因为能在命令行渲染出图片文件全靠它,其实不是服务器渲染出来的,而是iterm2 官方网站:https://www ...
- odoo13之文件预览widget/模块
本文示例代码可查看github仓库:odoo13_file_preview 文件预览效果图展示 效果描述: 1.当点击图片或者文件时展开图片. 2.当点击关闭按钮时关闭图片预览. 3.当点击下载按钮时 ...
- 手把手教你用 Spring Boot搭建一个在线文件预览系统!支持ppt、doc等多种类型文件预览
昨晚搭建环境都花了好一会时间,主要在浪费在了安装 openoffice 这个依赖环境上(Mac 需要手动安装). 然后,又一步一步功能演示,记录,调试项目,并且简单研究了一下核心代码之后才把这篇文章写 ...
- java 文件转成pdf文件 预览
一.前端代码 //预览功能 preview: function () { //判断选中状态 var ids =""; var num = 0; $(".checkbox& ...
随机推荐
- gitlab-ci-runner安装
前言 什么是CI/CD? CI (Continuous Integration) 持续集成, CD (Continuous Delivery) 持续部署 个人理解 本地开发代码, 提交远程仓库 仓库接 ...
- ELK入门使用-与springboot集成
前言 ELK官方的中文文档写的已经挺好了,为啥还要记录本文?因为我发现,我如果不写下来,过几天就忘记了,而再次捡起来必然还要经历资料查找筛选测试的过程.虽然这个过程很有意义,但并不总是有那么多时间去做 ...
- 程序设计语言——实践之路 笔记:Beginning
这本书已经看了不下3遍了,计划在6月写完1,3,6,7,8,9章的笔记. 为什么要写笔记呢,我觉得有这么几个必要: 1.一个概念的首次提出与补充会跨越几个章节,整理在一起有助记忆 2.所有书籍的安排都 ...
- 【SAP HANA】SAP HANA开篇(1)
有幸当前工作能够接触到SAP S/4,能够接触到史上无敌的HANA内存数据库.HANA的技术我就不多讲了,感兴趣的人可以去百度一下.当然,有人想在本机安装HANA来学习,但前提是你得有128G内存以上 ...
- MongoDB面试题
1.什么是MongoDB MongoDB是一个文档数据库,提供好的性能,领先的非关系型数据库.采用BSON存储文档数据.BSON()是一种类json的一种二进制形式的存储格式,简称Binary JSO ...
- asp.net core系列 44 Web应用 布局
一.概述 MVC的视图与Razor页面经常共享视觉和程序元素,通过使用布局来完成,布局还可减少重复代码.本章演示了以下内容的操作方法:(1)使用通用布局,(2)自定义布局,(3) 共享指令,(4)在呈 ...
- 【野草】SQL Server之索引解析(一)
1.写在前面 微软专门给出SQL Server设计思路及实现路线,从7大体系结构阐述是如何实现,通过了解这些,我们就可以总结出数据库设计原则.编程中sql写法及注意事项,从而优化我们的系统性能,本系列 ...
- Android6.0 源码修改之 仿IOS添加全屏可拖拽浮窗返回按钮
前言 之前写过屏蔽系统导航栏功能的文章,具体可看Android6.0 源码修改之屏蔽导航栏虚拟按键(Home和RecentAPP)/动态显示和隐藏NavigationBar 在某些特殊定制的版本中要求 ...
- Android之崩溃日志管理
文章大纲 一.Android崩溃日志管理简介二.崩溃日志管理实战三.项目源码下载 一.Android崩溃日志管理简介 1. 什么是android崩溃日志管理 开发中有些地方未注意可能造成异常抛 ...
- Spark学习之路 (一)Spark初识
目录 一.官网介绍 1.什么是Spark 二.Spark的四大特性 1.高效性 2.易用性 3.通用性 4.兼容性 三.Spark的组成 四.应用场景 正文 回到顶部 一.官网介绍 1.什么是Spar ...