首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

从零手写实现 nginx-05-MIME类型(多用途互联网邮件扩展类型)

前言

大家好,我是老马。很高兴遇到你。

我们为 java 开发者实现了 java 版本的 nginx, 可以处理静态文件

如果你想知道 servlet 如何处理的,可以参考我的另一个项目:

前言

上一篇文章中,我们默认支持的文件类型比较少,都是直接返回纯文本。

浏览器默认支持的文件类型肯定不止这么点。

我们先来一起学习下 MIME类型(Multipurpose Internet Mail Extensions,多用途互联网邮件扩展类型)

是什么?

MIME类型(Multipurpose Internet Mail Extensions,多用途互联网邮件扩展类型)是一种标准,用于定义消息(如电子邮件)和文件的类型,以及指定资源的格式。

在HTTP协议中,MIME类型用于描述发送的响应内容或请求的资源内容的格式。

MIME类型的组成:

一个MIME类型通常由两部分组成,用斜杠(/)分隔:

1.类型(Type):表示资源类型的一般分类,如text、image、application等。2.子类型(Subtype):表示该类型下的具体格式,如html、jpeg、xml等。

常见的MIME类型:

以下是一些常见的MIME类型及其描述:

•text/plain:普通的文本文件,如TXT文件。•text/html:HTML文档。•text/css:层叠样式表,用于定义网页的样式和布局。•text/javascript:JavaScript脚本文件。•application/json:JSON格式数据,常用于Web API。•application/xml:XML格式数据。•application/octet-stream:二进制流数据,常用于文件下载。•image/jpeg:JPEG格式的图片。•image/png:PNG格式的图片。•image/gif:GIF格式的图片。•audio/mpeg:MP3音频文件。•video/mp4:MP4视频文件。

MIME类型的作用:

1.内容识别:MIME类型帮助客户端(如浏览器)识别接收到的内容类型,从而决定如何正确处理或显示这些内容。

2.文件上传:在表单提交时,MIME类型用于指示上传文件的格式。3.响应头设置:服务器在HTTP响应中使用Content-Type头来指定响应内容的MIME类型。4.请求头设置:客户端在HTTP请求中使用Accept头来指定它能够处理的MIME类型。5.多部分类型:在发送多部分请求或响应时(如文件上传),使用multipart/*类型的MIME类型。

MIME类型与文件扩展名:

虽然MIME类型与文件扩展名(如.html、.jpg等)通常有直接的对应关系,但它们是两个不同的概念。

文件扩展名是操作系统用来识别文件类型的,而MIME类型是网络协议用来识别内容类型的。

服务器配置可以映射文件扩展名到MIME类型,以确定发送给客户端的正确类型。

常见文件的例子

text/plain:普通的文本文件,如TXT文件。

•text/html:HTML文档。•text/css:层叠样式表,用于定义网页的样式和布局。•text/javascript:JavaScript脚本文件。•application/json:JSON格式数据,常用于Web API。•application/xml:XML格式数据。•application/octet-stream:二进制流数据,常用于文件下载。•image/jpeg:JPEG格式的图片。•image/png:PNG格式的图片。•image/gif:GIF格式的图片。•audio/mpeg:MP3音频文件。•video/mp4:MP4视频文件。

文本类的

以下是各种MIME类型对应的文件内容示例:

text/plain:普通的文本文件,如TXT文件。

This is a plain text file.It contains raw text data that can be viewedin any text editor.

2.

text/html:HTML文档。

<meta charset="UTF-8"> <title>Example HTML Document</title> <h1>Hello, World!</h1> <p>This is an example of an HTML document.</p>

3.

text/css:层叠样式表,用于定义网页的样式和布局。

body { font-family: Arial, sans-serif; margin: 0; padding: 0;}

h1 { color: #333333;}

.container { width: 80%; margin: auto;}

4.

text/javascript:JavaScript脚本文件。

// This is a JavaScript filefunction sayHello() { alert('Hello, World!');}

document.addEventListener('DOMContentLoaded', (event) => { console.log('DOM fully loaded and parsed');});

5.

application/json:JSON格式数据,常用于Web API。

{ "name": "John Doe", "age": 30, "isEmployed": true, "address": { "street": "123 Main St", "city": "Anytown", "zip": "12345" }, "phoneNumbers": [ {"type": "home", "number": "555-0100"}, {"type": "mobile", "number": "555-0101"} ]}

6.

application/xml:XML格式数据。

每个示例都展示了相应MIME类型文件的基本结构和内容。这些示例可以根据需要进行扩展和修改,以适应不同的应用场景和数据表示需求。

核心代码

我们在代码处理时,添加上核心的文件类型响应。

/** * String format = "HTTP/1.1 200 OK\r\n" + * "Content-Type: text/plain\r\n" + * "\r\n" + * "%s"; * * @param bytes 原始内容 * @param status 结果枚举 * @param request 请求内容 * @param nginxConfig 配置 * @return 结果 */ protected FullHttpResponse buildCommentResp(byte[] bytes, final HttpResponseStatus status, final FullHttpRequest request, final NginxConfig nginxConfig) { byte[] defaultContent = new byte[]{}; if(ArrayPrimitiveUtil.isNotEmpty(bytes)) { defaultContent = bytes; }

// 构造响应 FullHttpResponse response = new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, status, Unpooled.copiedBuffer(defaultContent)); // 头信息 response.headers().set(HttpHeaderNames.CONTENT_TYPE, "text/plain;"); response.headers().set(HttpHeaderNames.CONTENT_LENGTH, response.content().readableBytes()); //如果request中有KEEP ALIVE信息 if (HttpUtil.isKeepAlive(request)) { response.headers().set(HttpHeaderNames.CONNECTION, HttpHeaderValues.KEEP_ALIVE); }

return response; }

protected void setContentType(FullHttpResponse response, String contentType) { response.headers().set(HttpHeaderNames.CONTENT_TYPE, contentType); }

这样在浏览中访问对应的图片等,就可以实现文件的预览。

小结

本节我们实现了常见的文件类别的处理,可以实现常见文件的预览。

下一节,我们一起来看一下如何实现文件夹的处理。

我是老马,期待与你的下次重逢。

开源地址

为了便于大家学习,已经将 nginx 开源

欢迎 fork + star 鼓励一下老马~

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OvK0V7NH19SbGkdpLREtVZBw0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券