Flask文件下载send_file中文文件名处理解决方案

  • Flask文件下载中文文件名处理解决方案
    • 问题背景
    • 问题分析
      • 核心问题
      • 常见症状
    • 解决方案
      • 技术实现
      • 关键技术点
    • 完整实现示例

Flask文件下载中文文件名处理解决方案

问题背景

在Web应用开发中,当用户下载包含中文字符的文件时,经常会遇到文件名乱码或无法正确显示的问题。这是由于HTTP协议中的 Content-Disposition 头部字段对非ASCII字符的处理限制导致的。

问题分析

核心问题

  • 编码问题 :HTTP头部字段默认使用ASCII编码,无法直接支持中文等Unicode字符
  • 浏览器兼容性 :不同浏览器对非ASCII文件名的处理方式不同
  • RFC标准 :需要遵循RFC 6266标准来正确处理国际化文件名

常见症状

  • 下载的文件名显示为乱码
  • 中文文件名变成问号或其他符号
  • 部分浏览器无法正确解析文件名

解决方案

技术实现

在Flask应用中,我们采用了双重编码策略来确保中文文件名的正确处理:

from urllib.parse import quote
from flask import send_file# 设置文件名,支持中文文件名
file_name = quote(download_name)
response.headers['Content-Disposition'] = f'attachment; filename="{file_name}"; filename*=utf-8\'\'\'{file_name}'

关键技术点

  1. URL编码处理
file_name = quote(download_name)
  • 使用 urllib.parse.quote() 对文件名进行URL编码
  • 将中文字符转换为百分号编码格式(如: %E4%B8%AD%E6%96%87 )
  1. 双重文件名策略
response.headers['Content-Disposition'] = f'attachment; filename="{file_name}"; 
filename*=utf-8\'\'\'{file_name}'

参数说明:

  • filename=“{file_name}” :为旧版浏览器提供ASCII兼容的文件名
  • filename*=utf-8’‘’{file_name} :符合RFC 6266标准的国际化文件名 3. RFC 6266标准格式
filename*=charset'language'encoded-filename
  • charset :字符集(utf-8)
  • language :语言标识(空字符串表示未指定)
  • encoded-filename :URL编码后的文件名

完整实现示例

class TaskDownloadAPI(Resource):def get(self, task_id):"""下载翻译后的文件"""try:# ... 其他业务逻辑 ...# 获取原始文件名download_name = task_info.get('original_filename')if not download_name:file_ext = os.path.splitext(output_file)[1]download_name = f"translated_{task_id}{file_ext}"# 创建响应response = send_file(output_file,as_attachment=True)# 设置文件名,支持中文文件名file_name = quote(download_name)response.headers['Content-Disposition'] = f'attachment; filename="{file_name}"; filename*=utf-8\'\'\'{file_name}'return responseexcept Exception as e:logger.error(f"文件下载异常 - 任务ID: {task_id}, 错误: {str(e)}")return {'error': f'下载文件时发生错误: {str(e)}'}, 500

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/87219.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/87219.shtml
英文地址,请注明出处:http://en.pswp.cn/web/87219.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

新手指南:在 Ubuntu 上安装 PostgreSQL 并通过 VS Code 连接及操作

本文档记录了一个初学者在 Ubuntu 系统上安装、配置 PostgreSQL 数据库,并使用 Visual Studio Code (VS Code) 作为客户端进行连接和操作的全过程。其中包含了遇到的常见错误、分析和最终的解决方案,旨在为新手提供一个清晰、可复现的操作路径。 最终目…

二刷 苍穹外卖day10(含bug修改)

Spring Task Spring框架提供的任务调度工具,可以按照约定的时间自动执行某个代码逻辑 cron表达式 一个字符串,通过cron表达式可以定义任务触发的时间 **构成规则:**分为6或7个域,由空格分隔开,每个域代表一个含义 …

Android Native 之 inputflinger进程分析

Android IMS原理解析 - 简书 Android 输入事件分发全流程梳理(一)_android input事件分发流程-CSDN博客 Android 输入事件分发全流程梳理(二)_android输入事件流程图-CSDN博客 inputflinger模块与surfaceflinger模块在同级目录…

Python实例题:基于 Flask 的在线聊天系统

目录 Python实例题 题目 要求: 解题思路: 代码实现: Python实例题 题目 基于 Flask 的在线聊天系统 要求: 使用 Flask 框架构建一个实时在线聊天系统,支持以下功能: 用户注册、登录和个人资料管理…

v-bind指令

好的,我们来学习 v-bind 指令。这个指令是理解 Vue 数据驱动思想的基石。 核心功能:v-bind 的作用是将一个或多个 HTML 元素的 attribute (属性) 或一个组件的 prop (属性) 动态地绑定到 Vue 实例的数据上。 简单来说,它在你的数据和 HTML …

【设计模式04】单例模式

前言 整个系统中只会出现要给实例,比如Spring中的Bean基本都是单例的 UML类图 无 代码示例 package com.sw.learn.pattern.B_create.c_singleton;public class Main {public static void main(String[] args) {// double check locking 线程安全懒加载 ⭐️ //…

飞算科技依托 JavaAI 核心技术,打造企业级智能开发全场景方案

在数字经济蓬勃发展的当下,企业对智能化开发的需求愈发迫切。飞算数智科技(深圳)有限公司(简称 “飞算科技”)作为自主创新型数字科技公司与国家级高新技术企业,凭借深厚的技术积累与创新能力,以…

20250701【二叉树公共祖先】|Leetcodehot100之236【pass】今天计划

20250701 思路与错误记录1.二叉树的数据结构与初始化1.1数据结构1.2 初始化 2.解题 完整代码今天做了什么 题目 思路与错误记录 1.二叉树的数据结构与初始化 1.1数据结构 1.2 初始化 根据列表,顺序存储构建二叉树 def build_tree(nodes, index0):# idx是root开始…

Web应用开发 --- Tips

Web应用开发 --- Tips General后端需要做参数校验代码风格和Api设计风格的一致性大于正确性数据入库时间应由后端记录在对Api修改的时候,要注意兼容情况,避免breaking change 索引对于查询字段,注意加索引对于唯一的字段,考虑加唯…

CSS 安装使用教程

一、CSS 简介 CSS(Cascading Style Sheets,层叠样式表)是用于为 HTML 页面添加样式的语言。通过 CSS 可以控制网页元素的颜色、布局、字体、动画等,是前端开发的三大核心技术之一(HTML、CSS、JavaScript)。…

机器学习中为什么要用混合精度训练

目录 FP16与显存占用关系机器学习中一般使用混合精度训练:FP16计算 FP32存储关键变量。 FP16与显存占用关系 显存(Video RAM,简称 VRAM)是显卡(GPU)专用的内存。 FP32(单精度浮点)&…

[附源码+数据库+毕业论文+答辩PPT]基于Spring+MyBatis+MySQL+Maven+vue实现的中小型企业财务管理系统,推荐!

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本中小型企业财务管理就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信…

华为云Flexus+DeepSeek征文 | 对接华为云ModelArts Studio大模型:AI赋能投资理财分析与决策

引言:AI金融,开启智能投资新时代​​ 随着人工智能技术的飞速发展,金融投资行业正迎来前所未有的变革。​​华为云ModelArts Studio​​结合​​Flexus高性能计算​​与​​DeepSeek大模型​​,为投资者提供更精准、更高效的投资…

从模型部署到AI平台:云原生环境下的大模型平台化演进路径

📝个人主页🌹:慌ZHANG-CSDN博客 🌹🌹期待您的关注 🌹🌹 一、引言:部署只是起点,平台才是终局 在过去一年,大语言模型的飞速发展推动了AI生产力浪潮。越来越多…

UI前端大数据可视化创新:利用AR/VR技术提升用户沉浸感

hello宝子们...我们是艾斯视觉擅长ui设计、前端开发、数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩! 在大数据与沉浸式技术高速发展的今天,传统二维数据可视化已难以满足复杂数据场景的…

MacOS 安装brew 国内源【超简洁步骤】

​/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"请输入序号:1

GENESIS64:全球知名的工业设备监控与可视化平台

一、概述 GENESIS64是一款由ICONICS开发的先进工业自动化软件平台,专为实现实时数据可视化、智能化监控及管理而设计。该平台采用模块化架构,具有高效的数据处理能力和灵活的扩展性,适用于各类工业环境,帮助企业实现自动化运营&a…

RNN(Recurrent Neural Network,循环神经网络)家族详解(RNN,LSTM,GRU)

文章目录 一、RNN基础:序列建模的核心思想1.1 RNN的本质与核心机制1.2 应用场景与结构分类 二、传统RNN:序列模型的起点2.1 内部结构与数学表达2.2 计算示例2.3 RNN在Pytorch中的API2.4 代码示例2.5 优缺点与梯度问题 三、LSTM:门控机制破解长…

多云密钥统一管理实战:CKMS对接阿里云/华为云密钥服务

某保险公司因阿里云KMS密钥与华为云密钥割裂管理,导致勒索事件中解密失败!据统计,73%企业因多云密钥分散管理引发数据恢复延迟(IDC 2024)。本文将详解安当CKMS统一纳管方案,实现跨云密钥全生命周期管控&…

光伏接入承载力计算仿真:基于图计算技术的自动建模技术研究

光伏接入承载力计算仿真:基于图计算技术的自动建模技术研究 一、 引言:挑战与机遇 光伏发电的大规模接入对中低压配电网的安全稳定运行带来了巨大挑战。精确评估电网对光伏的承载力(Hosting Capacity, HC)是保障消纳与安全的关键。传统承载力评估严重依赖电网仿真,而仿真…