如何安全地从URL获取文件扩展名?

2024-05-15 01:59:57 发布

您现在位置:Python中文网/ 问答频道 /正文

考虑以下url

http://m3u.com/tunein.m3u
http://asxsomeurl.com/listen.asx:8024
http://www.plssomeotherurl.com/station.pls?id=111
http://22.198.133.16:8024

确定文件扩展名(.m3u/.asx/.pls)的正确方法是什么?显然最后一个没有文件扩展名。

编辑:我忘了提到m3u/asx/pls是音频流的播放列表(文本文件),必须进行不同的解析。目标确定扩展名,然后将url发送到正确的解析函数。例如。


url = argv[1]
ext = GetExtension(url)
if ext == "pls":
  realurl = ParsePLS(url)
elif ext == "asx":
  realurl = ParseASX(url)
(etc.)
else:
  realurl = url
Play(realurl)
GetExtension()应该返回文件扩展名(如果有的话),最好不要连接到URL。

Tags: 文件comhttpurlwwwlistenextasx
3条回答

真正的正确方法是根本不使用文件扩展名。对有问题的URL执行GET(或HEAD)请求,并使用返回的“Content type”HTTP头获取内容类型。文件扩展名不可靠。

有关更多信息和有用的MIME类型列表,请参见MIME types (IANA media types)

这对于requestsmimetypes来说是最简单的:

import requests
import mimetypes

response = requests.get(url)
content_type = response.headers['content-type']
extension = mimetypes.guess_extension(content_type)

扩展名包含一个点前缀。例如,extension是内容类型'image/png''.png'

使用urlparse解析URL外的路径,然后使用os.path.splitext获取扩展名。

import urlparse, os

url = 'http://www.plssomeotherurl.com/station.pls?id=111'
path = urlparse.urlparse(url).path
ext = os.path.splitext(path)[1]

请注意,扩展名可能不是文件类型的可靠指示器。HTTPContent-Type头可能更好。

相关问题 更多 >

    热门问题