news 2026/10/23 19:28:48

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_pdfview或syncfusion_flutter_pdfviewer,注意这些库的平台支持情况。

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

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

ERNIE-4.5-0.3B-PT入门必看:从部署到调用的完整流程

ERNIE-4.5-0.3B-PT入门必看&#xff1a;从部署到调用的完整流程 1. 为什么选这个镜像&#xff1f;轻量高效&#xff0c;开箱即用 你是不是也遇到过这些问题&#xff1a;想试试国产大模型&#xff0c;但动辄几十GB显存要求让人望而却步&#xff1b;想快速验证一个文本生成想法&a…

作者头像 李华
网站建设 2026/10/24 1:42:41

Chord视觉定位模型部署教程:Supervisor进程守护+自动重启+日志轮转配置

Chord视觉定位模型部署教程&#xff1a;Supervisor进程守护自动重启日志轮转配置 1. 项目概述 Chord是一款基于Qwen2.5-VL多模态大模型的视觉定位服务&#xff0c;能够通过自然语言指令精确定位图像中的目标对象。本教程将详细介绍如何部署该服务&#xff0c;并配置Superviso…

作者头像 李华
网站建设 2026/10/23 11:14:54

从安装到使用:CLAP音频分类镜像完整操作手册

从安装到使用&#xff1a;CLAP音频分类镜像完整操作手册 你是否遇到过这样的场景&#xff1a;一段现场录制的环境音&#xff0c;想快速判断是施工噪音、鸟鸣还是警报声&#xff0c;却要先找专业工具、装依赖、写代码&#xff1f;又或者&#xff0c;正在开发一款智能听障辅助Ap…

作者头像 李华
网站建设 2026/10/22 8:16:45

AI绘画新体验:Z-Image Turbo一键生成惊艳作品

AI绘画新体验&#xff1a;Z-Image Turbo一键生成惊艳作品 1. 开箱即用的极速画板&#xff1a;为什么这次真的不一样&#xff1f; 你有没有过这样的经历&#xff1a; 花半小时调参数、等显存不爆、防黑图、修提示词&#xff0c;最后生成一张图——结果边缘发灰、手长了六根、天…

作者头像 李华
网站建设 2026/10/23 6:42:00

EagleEye部署教程:Kubernetes集群中弹性扩缩容EagleEye推理服务

EagleEye部署教程&#xff1a;Kubernetes集群中弹性扩缩容EagleEye推理服务 1. 为什么需要在K8s里跑EagleEye&#xff1f; 你有没有遇到过这样的情况&#xff1a;白天监控摄像头突然涌入大量视频流&#xff0c;检测请求暴增三倍&#xff0c;GPU显存直接飙到98%&#xff0c;服…

作者头像 李华