mime类型(Multipurpose Internet Mail Extensions)
媒体类型是一种标准,用来表示文档、文件或字节流的性质和格式。这里只是介绍,真实项目中会有其它实现方式。
Http服务可以通过设置响应头Content-type来表明响应体的mime类型,浏览器通过类型来决定资源处理。
常见的mime类型:
文件格式 | mime类型 |
---|---|
html | text/html |
css | text/css |
js | text/javascript |
jpg | image/jpeg |
png | image/png |
gif | image/gif |
mp4 | video/mp4 |
json | application/json |
对于未知的资源类型:可以使用application/octet-stream,浏览器遇到此类型,会对响应体独立存储,也就是下载效果
以上次的静态资源服务为例:
通获取文件的后缀名来设置对应的mime类型
const http = require('http');
// 文件模块
const fs = require('fs')
// 使用path 获取文件后缀
const path = require('path')
const mimes = {
html:'text/html',
css:'text/css',
js:'text/javascript',
jpg:'image/jpeg',
png:'image/png',
gif:'image/gif',
mp4:'video/mp4',
json:'application/json'
}
const server = http.createServer((resquest,response)=>{
let { pathname } = new URL(resquest.url,'http://127.0.0.1')
console.log(pathname)
let filePath = __dirname + '/assets'+ pathname
fs.readFile(filePath,(error,data)=>{
if(error){
response.statusCode = 500
response.end('文件读取失败')
return
}
// 获取后缀因为带有点,截取第一个
let suffix = path.extname(filePath).slice(1)
let type = mimes[suffix]
if(type){
response.setHeader('Content-type',type + ';charset=utf-8')
}else{
response.setHeader('Content-type','application/octet-stream')
}
response.end(data)
})
})
server.listen(9000,()=>{
console.log('启动成功')
})
实际不添加mime类型浏览器也是可以的,因为浏览器会根据资源类型自动判断,加上只是更规范。
需要了解的小问题
- 上面代码中,会发现在type后面增加了 ‘;charset=utf-8’,这是为什么呢?为了解决乱码问题,假如没有这个配置的话,那么代码中的中文注释等,会出现乱码问题。
- 正常网页中像css、js等是可以不设置utf-8的。
- 假设我们不设置utf-8,会发现html文件时不受影响的,因为在html文件中meta标签中会声明。
延申一个小问题:在服务中设置的mime类型,优先级会高于页面中设置的。
既然css、js等不受utf-8字符集影响,那其实可以修改成一下的形式。