当前位置: 首页 > news >正文

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的优势实现跨平台应用的开发。

http://www.jsqmd.com/news/331572/

相关文章:

  • 企业级科研项目验收管理系统管理系统源码|SpringBoot+Vue+MyBatis架构+MySQL数据库【完整版】
  • DynamoDB中的PartiQL查询优化技巧
  • 大数据领域中 Power BI 的优势及应用场景
  • SpringBoot+Vue 和智慧生活商城系统平台完整项目源码+SQL脚本+接口文档【Java Web毕设】
  • 如何设计能抗住千万级请求的提示工程高可用架构?架构师给你4个关键方案
  • 【Week6_Day29】【软件测试学习记录与反思】【阶段四 Python, 汉诺塔问题的代码实现, 递归思想的练习】
  • Java SpringBoot+Vue3+MyBatis 华府便利店信息管理系统系统源码|前后端分离+MySQL数据库
  • Java Web 科研项目验收管理系统系统源码-SpringBoot2+Vue3+MyBatis-Plus+MySQL8.0【含文档】
  • HBase的监控与调优,确保大数据存储稳定
  • 前后端分离Spring boot名城小区物业管理系统系统|SpringBoot+Vue+MyBatis+MySQL完整源码+部署教程
  • 前后端分离+电商应用系统系统|SpringBoot+Vue+MyBatis+MySQL完整源码+部署教程
  • SpringBoot+Vue 毕业设计成绩管理系统管理平台源码【适合毕设/课设/学习】Java+MySQL
  • 前后端分离光影系统|SpringBoot+Vue+MyBatis+MySQL完整源码+部署教程
  • HarmonyOS PC 文档模型完整范式
  • 华府便利店信息管理系统信息管理系统源码-SpringBoot后端+Vue前端+MySQL【可直接运行】
  • HarmonyOS 项目中如何拆分共用层与形态模型
  • 大语言模型综合排行榜 26-02-01图片本周排名前10的模型为:Gemini 3 ProGPT-5.2Gemini 3 FlashClaude Opus 4.5GPT
  • Qwen3-Coder: 在世界中自主编程
  • 为什么 MES 集成项目会普遍采用“点对点”的集成模式
  • 2026-02-02 全国各地响应最快的 BT Tracker 服务器(移动版)
  • UE5 多线程(2-3):时间范围类 FDateRange 与 TRange<T>。
  • Linux基础指令(一)
  • 不是所有AI爆款都靠运气,Clawbot作者之一Peter Steinberger,已经为开源社区写了10多年的贡献
  • Nano-Banana保姆级教学:white background+flat lay提示词组合技巧
  • WAN2.2-文生视频+SDXL_Prompt风格实战案例:独立开发者打造AI短视频SaaS原型
  • 轻量级模型实测:YOLOv13-N仅2.5M参数高效运行
  • 深入探讨Clang 16的Niebloid编译问题
  • RTX 4090优化神器:Anything to RealCharacters 2.5D转真人实战体验
  • DeepSeek-OCR-2惊艳案例:手写签名+印刷正文混合文档,仅正文结构化输出
  • 巴菲特-芒格的氢能源投资:清洁能源的下一个前沿