(数据科学学习手札114)Python+Dash快速web应用开发——上传下载篇 (2)

  但像前面的例子那样直接在定义app.layout时就传入实际的du.Upload()部件,会产生一个问题——应用启动后,任何访问应用的用户都对应一样的upload_id,这显然不是我们期望的,因为不同用户的上传文件会混在一起。

  因此可以参考下面例子的方式,在每位用户访问时再渲染随机id的上传部件,从而确保唯一性:

app3.py

import dash import dash_uploader as du import dash_bootstrap_components as dbc import dash_html_components as html import uuid app = dash.Dash(__name__) # 配置上传文件夹 du.configure_upload(app, folder='temp') def render_random_id_uploader(): return du.Upload(, text='点击或拖动文件到此进行上传!', text_completed='已完成上传文件:', cancel_button=True, pause_button=True, filetypes=['md', 'mp4'], default_style={ 'background-color': '#fafafa', 'font-weight': 'bold' }, upload_id=uuid.uuid1() ) def render_layout(): return html.Div( dbc.Container( render_random_id_uploader() ) ) app.layout = render_layout if __name__ == '__main__': app.run_server(debug=True)

  可以看到,每次访问时由于upload_id不同,因此不同的会话拥有了不同的子目录。

(数据科学学习手札114)Python+Dash快速web应用开发——上传下载篇

图4 2.1.3 配合du.Upload()进行回调

  在du.Upload()中额外还有isCompleted与fileNames两个属性,前者用于判断当前文件是否上传完成,后者则对应此次上传的文件名称,参考下面这个简单的例子:

app4.py

import dash import dash_uploader as du import dash_bootstrap_components as dbc import dash_html_components as html from dash.dependencies import Input, Output, State app = dash.Dash(__name__) # 配置上传文件夹 du.configure_upload(app, folder='temp') app.layout = html.Div( dbc.Container( [ du.Upload(id='uploader'), html.H5('上传中或还未上传文件!',) ] ) ) @app.callback( Output('upload_status', 'children'), Input('uploader', 'isCompleted'), State('uploader', 'fileNames') ) def show_upload_status(isCompleted, fileNames): if isCompleted: return '已完成上传:'+fileNames[0] return dash.no_update if __name__ == '__main__': app.run_server(debug=True, port=8051)

(数据科学学习手札114)Python+Dash快速web应用开发——上传下载篇

图5 2.2 配合flask进行文件下载

  相较于文件上传,在Dash中进行文件的下载就简单得多,因为我们可以配合flask的send_from_directory以及html.A()部件来为指定的服务器端文件创建下载链接,譬如下面的简单示例就打通了文件的上传与下载:

app5.py

from flask import send_from_directory import dash import dash_uploader as du import dash_html_components as html import dash_bootstrap_components as dbc from dash.dependencies import Input, Output import os app = dash.Dash(__name__) du.configure_upload(app, 'temp', use_upload_id=False) app.layout = html.Div( dbc.Container( [ du.Upload(id='upload'), html.Div( ) ] ) ) @app.server.route('/download/<file>') def download(file): return send_from_directory('temp', file) @app.callback( Output('download-files', 'children'), Input('upload', 'isCompleted') ) def render_download_url(isCompleted): if isCompleted: return html.Ul( [ html.Li(html.A(f'/{file}', href=http://www.likecs.com/f'/download/{file}', target='_blank')) for file in os.listdir('temp') ] ) return dash.no_update if __name__ == '__main__': app.run_server(debug=True)

(数据科学学习手札114)Python+Dash快速web应用开发——上传下载篇

图6 3 用Dash编写简易个人网盘应用

  在学习了今天的案例之后,我们就掌握了如何在Dash中开发文件上传及下载功能,下面我们按照惯例,结合今天的主要内容,来编写一个实际的案例;

  今天我们要编写的是一个简单的个人网盘应用,我们可以通过浏览器访问它,进行文件的上传、下载以及删除:

(数据科学学习手札114)Python+Dash快速web应用开发——上传下载篇

图7

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsxgyy.html