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

AI问答-HTTP:理解 Content-Disposition

本文背景

在下载arraybuffer文件时,想要获取文件名,这时引入本文内容Content-Disposition,我们在Content-Disposition获取到文件名就可以在下载后的文件以该文件名命名了。

一、简介

Content-Disposition是HTTP协议中的一个响应头字段,它主要用于指示如何处理响应的内容以及如何呈现给用户。这个字段是MIME协议类型的扩展,用于指导MIME用户代理(如浏览器)如何显示附加的文件。Content-Disposition的主要用途包括控制文件是直接在浏览器中打开,还是提示用户下载,并可以指定下载文件的默认名称。

二、Content-Disposition的定义与语法

Content-Disposition字段的语法如下

Content-Disposition: <disposition-type> [; <parameter-name>="<parameter-value>"]

<disposition-type>:表示处理方式,常见的值有"inline"和"attachment"。

"inline":表示内容应该尝试直接在浏览器中显示,这是默认值。

"attachment":表示内容应该作为附件下载,此时通常会附加一个filename参数来指定下载文件的默认名称。

<parameter-name>和<parameter-value>:用于进一步定义文件的处理细节,如文件名、字符编码等。

三、Content-Disposition的用途

3.1、文件下载

当服务器希望用户下载文件而不是在浏览器中直接打开时,可以在响应头中包含Content-Disposition: attachment; filename="文件名"。这样,浏览器会弹出一个下载对话框,让用户选择保存文件的位置和文件名(如果服务器指定了文件名,则作为默认文件名)。

这样在下载arraybuffer类型的文件时候就可以拿到文件名了。

// 获取文件名
let fileName = res.headers['content-disposition'].split('filename=')[1]
if (!fileName) {fileName = res.headers['content-disposition'].split('UTF-8\'\'')[1]
}
fileName = fileName ? fileName.replace(/\"/g, '') : 'file.xlsx'
fileName = decodeURI(fileName) || ''

3.2、文件上传

虽然在文件上传的HTTP请求中不直接设置Content-Disposition响应头,但Content-Disposition在请求体中用于定义表单数据的格式。特别是当使用multipart/form-data编码类型上传文件时,每个表单字段(包括文件)都会用Content-Disposition来标识其名称和(对于文件)文件名。

四、注意事项

当使用filename参数指定文件名时,如果文件名包含非ASCII字符(如中文),可能需要使用URL编码或filename*参数来确保兼容性。

在某些浏览器中,如果文件名包含空格或特殊字符,可能需要额外的处理来确保文件名在下载后正确显示。

Content-Disposition与Content-Type头字段通常一起使用,以提供关于响应内容的完整信息。

HTTP/1.1 200 OK  
Content-Type: application/pdf  
Content-Disposition: attachment; filename="example.pdf"  ...(PDF文件内容)...

在这个示例中,服务器响应了一个PDF文件,并通过Content-Disposition头字段指示浏览器将其作为附件下载,下载时的默认文件名为"example.pdf"。

五、欢迎交流指正

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • ovirt error: Network not found: no network with matching name ‘vdsm-ovirtmgmt‘
  • 重生归来之挖掘stm32底层知识(1)——寄存器
  • 如何使用Privoxy将SOCKS5代理转换为HTTP代理?
  • mysql中的json查询
  • yolo自动化项目实例解析(三)重构 1.85
  • 【CSS】选择器(基础选择器、复合选择器、属性匹配选择器、结构伪类选择器、伪元素选择器)
  • 粘接黑科技标杆专业展会-ASE CHINA 2024 震撼开幕!
  • 麒麟操作系统 MySQL 主从搭建
  • NCNN 学习(2)-Mat
  • 通过springcloud gateway优雅的进行springcloud oauth2认证和权限控制
  • 基于神经网络的光线追踪
  • 2024“华为杯”中国研究生数学建模竞赛(E题)深度剖析|数学建模完整过程+详细思路+代码全解析
  • OpenCV_图像旋转超详细讲解
  • 轻量级流密码算法Trivium
  • Vue前端无法接收到后端返回的数据以及全局CSS样式影响(已解决)
  • [deviceone开发]-do_Webview的基本示例
  • 【编码】-360实习笔试编程题(二)-2016.03.29
  • Angular 响应式表单之下拉框
  • Apache Spark Streaming 使用实例
  • C++入门教程(10):for 语句
  • FineReport中如何实现自动滚屏效果
  • iOS | NSProxy
  • js
  • leetcode46 Permutation 排列组合
  • mysql 5.6 原生Online DDL解析
  • SSH 免密登录
  • Vue2 SSR 的优化之旅
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • 翻译--Thinking in React
  • 简单易用的leetcode开发测试工具(npm)
  • 手写双向链表LinkedList的几个常用功能
  • 一个JAVA程序员成长之路分享
  • 正则学习笔记
  • const的用法,特别是用在函数前面与后面的区别
  • Semaphore
  • 仓管云——企业云erp功能有哪些?
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • ​必胜客礼品卡回收多少钱,回收平台哪家好
  • (003)SlickEdit Unity的补全
  • (笔记)Kotlin——Android封装ViewBinding之二 优化
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (论文阅读26/100)Weakly-supervised learning with convolutional neural networks
  • (七)Appdesigner-初步入门及常用组件的使用方法说明
  • (七)理解angular中的module和injector,即依赖注入
  • (十七)Flink 容错机制
  • (学习日记)2024.02.29:UCOSIII第二节
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • .Net - 类的介绍
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
  • .NET 命令行参数包含应用程序路径吗?
  • .net6 webapi log4net完整配置使用流程
  • :not(:first-child)和:not(:last-child)的用法
  • @RequestBody与@RequestParam
  • [16/N]论得趣