附加项
创建和解析HTTP Content-Disposition 头
安装
$ npm install content-disposition
API
import { create, parse, format } from 'content-disposition';
创建(文件名,选择)
创建附件 Content-Disposition 头值使用给定的文件名,
如果提供的。这个 filename 是可选的,如果不需要文件名,但是您
想要指定 options,设置 filename 来 undefined。
res.setHeader('Content-Disposition', create('∫ maths.pdf'));
请注意 HTTP报头是ISO-8859-1字符集。如果你在写这篇文章
头通过的方式不同于 setHeader 在Node.js中,您需要指定
这个 'binary' 在Node.js中编码。
选项
contentDisposition 在options对象中接受这些属性。
回退
如果 filename 选项在US-ASCII之外,则文件名实际上是
存储在一个补充字段中,用于支持Unicode文件名和
自动生成US-ASCII版本的文件名。
指定US-ASCII文件名以覆盖自动生成或
禁用全部生成,默认为 true。
- 字符串将指定要使用的US-ASCII文件名来代替automatic 的一代。
false将禁用包括US-ASCII文件名,只包括 Unicode版本(除非文件名已经是US-ASCII)。true如果文件名在US-ASCII之外,将启用自动生成。
如果 filename 选项是US-ASCII,该选项被指定并具有
不同的值,则 filename 选项在扩展字段中编码
这一组作为后备字段,即使它们都是US-ASCII。
类型
指定处置类型,默认为 "attachment"。这也可以是
"inline",或任何其他值(除inline外的所有值都被视为
attachment,但如果双方同意,可以传达额外的信息
它)。
parse (string,选项)
const disposition = parse(
'attachment; filename="EURO rates.txt"; filename*=UTF-8\'\'%e2%82%ac%20rates.txt',
);
解析 Content-Disposition 标题字符串。这将自动处理扩展
("Unicode")参数,通过解码并在标准下提供
参数名称。这将返回一个具有以下属性的对象:
-
type:处置类型(总是小写)。例子:'attachment' -
parameters:参数配置(参数名)中的参数对象 总是用小写字母和扩展版本替换非扩展版本)。例子:{filename: "€ rates.txt"}
选项
多部分
使用浏览器解析参数 multipart/form-data 的行为。
parse('form-data; name="file"; filename="the %22plans%22.pdf"', {
multipart: true,
});
扩展
解码时自动解析RFC 5987扩展报头参数
参数,默认为 true。
格式(obj选项)
const disposition = format({
type: 'attachment',
parameters: {
filename: '€ rates.txt',
},
});
将对象格式化为a Content-Disposition 标题字符串。这个自动
处理扩展("Unicode")参数并返回一个字符串。例子:
'attachment; filename*=UTF-8''%E2%82%AC%20rates.txt'
选项
多部分
使用浏览器格式化参数 multipart/form-data 的行为。这个报价
参数值,转义 " 作为 %22,并直接写入Unicode值
而不是使用扩展参数。
format(
{
type: 'form-data',
parameters: { name: 'file', filename: '€ rates.txt' },
},
{ multipart: true },
);
扩展
使用RFC 5987扩展头参数编码Unicode参数值
如。 filename*=,默认为 true。
例子
发送一个文件供下载
import fs from 'node:fs';
import http from 'node:http';
import { create } from 'content-disposition';
import onFinished from 'on-finished';
const filePath = '/path/to/public/plans.pdf';
http.createServer(function onRequest(req, res) {
// set headers
res.setHeader('Content-Type', 'application/pdf');
res.setHeader('Content-Disposition', create(filePath));
// send file
const stream = fs.createReadStream(filePath);
stream.pipe(res);
onFinished(res, function () {
stream.destroy();
});
});
当地的演示
在本地运行上传检查器:
npm run demo
然后打开 http://127.0.0.1:3000 在浏览器中。该演示允许您上传文件,检查浏览器发送的多部分上传部分头,并将它们与下载进行比较 Content-Disposition 这个包生成的头文件。
测试
$ npm test
参考文献
- 超文本传输协议——HTTP/1.1
- RFC 5987:超文本传输协议(HTTP)报头字段参数的字符集和语言编码
- RFC 6266:超文本传输协议(HTTP)中内容处理头字段的使用
- RFC 8187:指示HTTP报头字段参数的字符编码和语言
- HTML生活标准:多部分表单数据
- HTTP内容处理报头字段(RFC 6266)和RFC 2047、2231和5987中定义的编码的测试用例