news 2026/6/20 4:59:49

Flask与Flutter:无缝上传与显示文件

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Flask与Flutter:无缝上传与显示文件

在现代Web应用中,文件上传和显示功能是常见的需求。本文将介绍如何使用Flask作为后端和Flutter作为前端来实现一个文件上传到Azure Blob Storage并在前端显示的完整流程。

环境准备

首先,我们需要确保以下环境配置:

  • Python 3.7+
  • Flutter SDK
  • Azure存储账户
  • 安装必要的Python库:flask,flask_cors,azure-storage-blob
pipinstallflask flask_cors azure-storage-blob

Flask后端配置

1. 配置Azure存储

我们首先在Flask中配置Azure Blob Storage的连接:

fromazure.storage.blobimportBlobServiceClient,BlobClient,ContainerClient,generate_blob_sas,BlobSasPermissions connect_str='DefaultEndpointsProtocol=CONNECTION_STRING_ETC'container_name="documents"blob_service_client=BlobServiceClient.from_connection_string(conn_str=connect_str)container_client=blob_service_client.create_container(container_name)

2. 定义上传路由

定义一个上传文件的路由,处理文件上传到Azure Blob Storage:

@app.route('/upload',methods=['POST'])defupload_file():if'file'notinrequest.files:returnjsonify({"message":"No file available","status":"fail"}),400file=request.files['file']iffile.filename=='':returnjsonify({"message":"No selected file","status":"fail"}),400iffile:timestamp=datetime.now().strftime('%Y-%m-%d_%H:%M:%S')filename=secure_filename(f"{timestamp}_{file.filename}")blob_client=container_client.get_blob_client(filename)blob_client.upload_blob(file.stream,overwrite=True)file_url=blob_client.urlreturnjsonify({"message":"File uploaded successfully","status":"success","file_url":file_url}),200

3. 生成SAS Token

为了安全地访问文件,我们使用SAS Token来生成临时URL:

@app.route('/upload/<path:filename>',methods=['GET'])defuploaded_file(filename):blob_client=container_client.get_blob_client(filename)sas_token=generate_blob_sas(account_name=blob_service_client.account_name,container_name=container_name,blob_name=filename,account_key=blob_service_client.credential.account_key,permission=BlobSasPermissions(read=True),expiry=datetime.now(datetime.UTC)+timedelta(hours=1))signed_url=f"{blob_client.primary_endpoint}/{container_name}/{blob_client.blob_name}?{sas_token}"returnjsonify({"file_url":signed_url,"status":"success"})

Flutter前端实现

1. 接收文件URL

在Flutter中,我们需要从Flask获取文件的URL并显示:

Future<void>fetchFile()async{setState((){isLoading=true;});finalresponse=awaithttp.get(Uri.parse('http://127.0.0.1:5000/upload/$filename'));if(response.statusCode==200){vardata=jsonDecode(response.body);setState((){fileUrl=data['file_url'];isLoading=false;});}else{throwException('Failed to load file');}}

2. 显示文件

根据文件类型(PDF或图片)选择不同的显示方式:

WidgetbuildFileWidget(){if(isLoading){returnCenter(child:CircularProgressIndicator());}elseif(fileUrl!=null){if(fileUrl!.toLowerCase().endsWith('.pdf')){returnPDF().cachedFromUrl(fileUrl!);}else{returnCachedNetworkImage(imageUrl:fileUrl!,placeholder:(context,url)=>CircularProgressIndicator(),errorWidget:(context,url,error)=>Icon(Icons.error),);}}else{returnCenter(child:Text('File not found'));}}

调试与问题解决

  • 空白页面问题:检查fileUrl是否正确接收到了URL,确保Azure存储配置正确,CORS设置正确。
  • PDF显示问题:考虑使用flutter_pdfviewsyncfusion_flutter_pdfviewer,注意这些库的平台支持情况。

通过上述步骤,我们可以构建一个功能完备的文件上传和显示系统,利用Flask和Flutter的优势实现跨平台应用的开发。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/28 19:32:45

ERNIE-4.5-0.3B-PT快速部署指南:3步搭建文本生成环境

ERNIE-4.5-0.3B-PT快速部署指南&#xff1a;3步搭建文本生成环境 1. 为什么选这个镜像&#xff1f;轻量、开箱即用、真能跑起来 你是不是也遇到过这些情况&#xff1a; 下载了一个“轻量级”模型&#xff0c;结果发现要自己配环境、改代码、调参数&#xff0c;折腾半天连服务…

作者头像 李华
网站建设 2026/6/17 7:15:14

开源MinerU镜像免配置实操:3步完成学术论文图像解析与多轮对话

开源MinerU镜像免配置实操&#xff1a;3步完成学术论文图像解析与多轮对话 1. 为什么学术人需要一个“会看图”的AI助手&#xff1f; 你有没有过这样的经历&#xff1a;深夜赶论文&#xff0c;突然发现PDF里一张关键图表无法复制文字&#xff1b;导师发来一份扫描版会议论文&…

作者头像 李华
网站建设 2026/6/13 21:06:57

如何用WebLaTeX提升学术写作效率:从入门到精通完全指南

如何用WebLaTeX提升学术写作效率&#xff1a;从入门到精通完全指南 【免费下载链接】WebLaTex A complete alternative for Overleaf with VSCode Web Git Integration Copilot Grammar & Spell Checker Live Collaboration Support. Based on GitHub Codespace and D…

作者头像 李华
网站建设 2026/6/17 0:11:59

阿里达摩院MT5体验报告:中文改写效果实测

阿里达摩院MT5体验报告&#xff1a;中文改写效果实测 1. 引言 你有没有遇到过这些情况&#xff1f; 写完一段产品介绍&#xff0c;反复修改三遍还是觉得“不够顺”&#xff1b; 给客服团队准备话术库&#xff0c;翻来覆去就那几句话&#xff0c;用户一听就腻&#xff1b; 训练…

作者头像 李华