这是我参与「第五届青训营 」伴学笔记创作活动的第 10 天
这篇笔记总结了大项目遇到的一些问题以及对这些问题的总结。本次是第三次大项目总结。
本次的大项目遇到的问题是,如果用户将一个文件后缀改为mp4文件,强行将这个文件变成一个“视频”文件,并上传到了抖音,导致抖音不能播放,应该怎么解决?
实际上,文件后缀名的作用是告诉操作系统在打开文件时应该采取什么行为,并不是真正代表了这个文件的类型。对于视频来说,可以采用MIME类型来判断用户上传的文件是否是视频。MIME类型,即媒体类型(通常称为 Multipurpose Internet Mail Extensions 或 MIME 类型)是一种标准,用来表示文档、文件或字节流的性质和格式。它在IETF RFC 6838中进行了定义和标准化。MIME的作用在于告诉接收者在接收和解析这个文件时采取的行为。通过判断文件的MIME类型,就可以让假“视频”不被上传到服务器。
在Go标准库http中,提供了一个函数DetectContentType()可以判断文件的MIME类型,这个函数会返回文件的MIMIE类型。MIME类型有多种,如以下所示: text/plain
text/html
image/jpeg
image/png
audio/mpeg
audio/ogg
audio/*
video/mp4
application/*
application/json
application/javascript
application/ecmascript
application/octet-stream
比如,test.mp4文件,使用http.DetectContentType()返回的值就是vedio/mp4。
此外,当文件类型无法判断时,会返回application/octet-stream
我们在大项目中,只需要判断用户上传的是不是视频,不需要关注是mp4/avi/rmvb等,因此,只需要判断返回值中是否含有vedio,如果有则返回true,没有则返回false。
具体判断代码如下:
// 检测文件是否是视频文件
func isVideo(videoPath string) bool {
file_bytes, err := os.ReadFile(videoPath)
if err != nil {
log.Fatal(err)
}
FileType := http.DetectContentType(file_bytes)
fmt.Println(FileType)
if strings.Contains(FileType, "video") {
return true
} else {
return false
}
以上就是我本次大项目的总结:对用户上传假视频类型文件的处理方式。本人水平有限,如有错误欢迎指正。