背景:
上一篇文章分享了一个本地的实现方案,但是这个尽管打包成exe的完整包的方式,由于实现方式是使用python,打包出来后的文件里包含了使用到的库和python运行程序,启动时内部会需要解压出来,所以启动会比较慢,大概3~5秒启动,对于追求性能的优秀人才就会觉得这个效率太低了,那能不能实现一个web方案,这样web端提供一个传入需要转换的文件,然后返回一个转换好的文件,这样就不需要每个人的包都那么大,运行还慢,而且还没法实时更新。
解决方案:
1.通过web前端进行文件上传到服务器上,设置一个提交页面模板文件uploader.html
<html>
<head>
<meta charset="UTF-8">
<title>文件上传</title>
</head>
<body>
<form action="/uploadfile" method="POST" enctype="multipart/form-data">
<input type="file" name="uploadfile" />
<input type="submit" value="提交" />
</form>
</body>
</html>
2.创建一个接口进行文件的上传,利用flask进行接口生成
from flask import Flask
from biz.openapi.com_api_webres import blue_webres_mgr
webapp = Flask(__name__, template_folder='../biz/templates')
webapp.register_blueprint(blueprint=blue_webres_mgr)
if __name__ == '__main__':
webapp.run(port=8083)
blue_webres_mgr = Blueprint('webres_mgr', __name__, template_folder='../templates')
webconfig = {}
webconfig['UPLOAD_FOLDER'] = '../upload/'
@blue_webres_mgr.route('/upload')
def upload_file():
return render_template('uploader.html')
@blue_webres_mgr.route('/uploadfile',methods=['GET','POST'])
def uploader_File():
if request.method == 'POST':
f = request.files['uploadfile']
basefilepath = os.path.join(webconfig['UPLOAD_FOLDER']) + f.filename
newfilename = ''
if os.path.exists(basefilepath):
fileext = os.path.splitext(f.filename)[-1]
filename = os.path.basename(f.filename).split(fileext)[0]
newfilename = "{}_{}{}".format(filename, int(time.time()), fileext)
basefilepath = "{}{}".format(os.path.join(webconfig['UPLOAD_FOLDER']),newfilename)
f.save(basefilepath)
transcsv = TransCSVDataToSql(basefilepath)
filepath, webdir, sqlfile = transcsv.TransFile()
linkurl = 'http://127.0.0.1/{}/{}'.format(webdir, sqlfile)
return render_template('downloadsql.html',transfile= f.filename,respath=filepath,linkurl=linkurl, sqlfile=sqlfile)
else:
return render_template('uploader.html')
3.利用nginx建立一个web网站服务,可以直接使用phpstudy一键部署
启动nginx就可以了,当然如果需要配置不同的端口,还有地址的,自行通过配置按钮进行配置
4.调用上一篇文章中的文件读取,转换的实现类进行文件的转换和存储
转换后的文件直接存放到web网站的www下的工程目录下
首先配置好自己的目录地址
def __init__(self, csvFile:str):
self.CSVFile = csvFile
# 保存的文件名
self.SaveFile = 'trans_{}.sql'.format(time.time())
# 项目保存的目录
self.WebDir = 'softfiles'
# phpstudy指定的www所在目录+项目的目录
self.WebbasePath = 'D:/phpstudy_pro/WWW/softfiles/'
配置的是WWW就是网站下的softfiles目录下
5.输出网站可以访问到的页面下载地址
配置web可以访问的到的地址
linkurl = 'http://127.0.0.1/{}/{}'.format(webdir, sqlfile)
如果发布在公网或者内网上,则把127.0.0.1的IP更改为部署好的服务器域名或IP即可
配置下载页面的html模板downloadsql.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>转换好的sql</title>
</head>
<body>
<table border="1">
<tr>
<th>文件所在路径</th>
<th>需要转换的csv文件</th>
<th>转换完成的sql文件</th>
<th>下载地址</th>
</tr>
<tr>
<td>{{respath}}</td>
<td>{{transfile}}</td>
<td>{{sqlfile}}</td>
<td><a href={{linkurl}}>下载地址</a></td>
</tr>
</table>
</body>
</html>
6.来看看最终的效果吧
启动服务端,
启动Nginx,在浏览器中输入
127.0.0.1:8083/upload
出现页面
然后点击浏览,打开导出的csv文件
选择好后点击打开,最后点击页面中的“提交”按钮
会展现一个下载页面地址
点击下载地址即可进行转换后的文件的下载,然后就可以使用这个sql脚本进行刷库了
结语:
通过这个web端的转换,对于使用用户来说,只需要输入一个地址,然后上传文件即可完成转换工作,比本地版要快速很多,而且只要web端更新了新的解析规则,自己都不需要去处理,自然就能使用到最新的,启动效率也是大大提升。
好了,今天的分享就到这了,感谢大家的阅读!