我的上传表单需要一个tar文件,我想检查上传的数据是否有效。tarfile模块支持is_tarfile()
,但需要文件名 - 我不想浪费资源将文件写入磁盘只是为了检查它是否有效。
有没有一种方法可以使用标准Python库在不写入磁盘的情况下检查数据是否是有效的tar文件?
我的上传表单需要一个tar文件,我想检查上传的数据是否有效。tarfile模块支持is_tarfile()
,但需要文件名 - 我不想浪费资源将文件写入磁盘只是为了检查它是否有效。
有没有一种方法可以使用标准Python库在不写入磁盘的情况下检查数据是否是有效的tar文件?
tar文件格式在维基百科这里。
我猜你最好的选择是检查第一个文件的头校验和是否有效。你可能还想检查文件名是否正确,但这可能不可靠,这取决于存储在其中的文件名。
在此复制相关信息:
Offset Size Description
0 100 File name
100 8 File mode
108 8 Owner's numeric user ID
116 8 Group's numeric user ID
124 12 File size in bytes
136 12 Last modification time in numeric Unix time format
148 8 Checksum for header block
156 1 Link indicator (file type)
157 100 Name of linked file
TarFile类接受一个fileobj对象。我猜您可以传递从Web框架获取的任何部分下载实体。
__init__(self, name=None, mode='r', fileobj=None)
补充paxdiablo的帖子:tar是一种非常复杂和复杂的文件格式,尽管它看起来很简单。您可以检查基本约束条件,但如果您必须支持所有可能存在的tar方言,您将会浪费很多时间。其复杂性大部分来自以下问题:
此外,该格式没有预先的头文件,因此检查整个存档是否合理的唯一方法是完全扫描文件,捕获每个记录并验证每个记录。
假设您上传的数据包含在字符串data
中。
from tarfile import TarFile, TarError
from StringIO import StringIO
sio = StringIO(data)
try:
tf = TarFile(fileobj=sio)
# process the file....
except TarError:
print "Not a tar file"
除了处理不同的tar文件格式和压缩,还存在其他复杂性。更多信息可在tarfile文档中找到。
tarfile
的 open
方法接受一个类文件对象作为其 fileObj
参数。这可以是一个 StringIO
实例。