如何获取HTTP响应的MIME类型和媒体子类型?

4
我想要存储从GET请求获取的响应的MIME类型。我使用了DetectContentType函数,但它会为js和css资源都返回text/plain; charset=utf-8。我需要区分每个URL的文件类型,而我正依赖于MIME类型来实现这一点。
response, error := http.Get(url) 
if error == nil { 
    contentType := response.Header.Get("Content-Type") 
    // ... 
}

只给我内容类型。


你的 Go 程序正在向服务器发出请求,而你正在尝试获取响应的 MIME 类型?你是否检查过服务器是否正确设置了内容类型? - rob74
我正在尝试爬取网站。这对网络爬虫来说是不是个坏主意?因为我们无法确定它是否安全。 - Sunil
@Sunil 这可能是由于服务器配置不当。在 HTML 文件中,您还可以检查 META 标签以覆盖头文件或缺少头文件。在 JS 和 CSS 中,您可能需要添加启发式检查。 - Not_a_Golfer
1个回答

4
听起来你可以使用Go的mime包。mime包中的TypeByExtension方法可能适合您的需求。
我相信这个方法使用主机系统的mime类型表。通过这种方法确定的mime类型可能与远程服务器报告的mime类型不同。 https://golang.org/pkg/mime/#TypeByExtension
import "mime"

func DetermineMimeType (fileExtension string) string {
    return mime.TypeByExtension(fileExtension)
}

请确保传入完整的文件扩展名,包括句号,例如“.js”或“.css”。为了涵盖所有情况,如果无法确定文件的扩展名或此方法没有返回MIME类型,则可以默认使用远程服务器报告的MIME类型。


任何一个投票反对的人可以解释一下你不同意什么吗? - hradac
因为原帖作者想要获取文件的内容类型,而你的解决方案只检查了扩展名,这是不可靠且对原帖作者想要的完全没有用处的。(声明:我没有投票反对,因为该解决方案已经在帖子的评论中写明) - rsz
1
@rsz 很公平。再看一遍,我应该更仔细地阅读它。我以为这是一个关于如何确定 MIME 类型的一般性问题,而 OP 想要的是从响应头中获取 MIME 类型。 尽管我不同意文件扩展名的观点。它们通常是系统用来确定文件类型的方式。此外,Web 服务器使用文件扩展名来确定在响应标头中返回的 MIME 类型。 - hradac

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接