前言
大家好,我是老马。很高兴遇到你。
我们为 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 鼓励一下老马~
领取专属 10元无门槛券
私享最新 技术干货