Python 如何确定数据在没有文件的情况下是否是有效的tar文件?
我的上传表单需要一个tar文件,我想检查上传的数据是否有效。该模块支持,但需要一个文件名-我不想浪费资源将文件写入磁盘只是为了检查它是否有效 有没有办法使用标准Python库检查数据是否为有效的tar文件而不写入磁盘?tar文件格式在Wikipedia上 我想最好的办法是检查第一个文件的头校验和是否有效。您可能还希望检查文件名是否健全,但这可能不可靠,具体取决于存储在其中的文件名 在此处复制相关信息:Python 如何确定数据在没有文件的情况下是否是有效的tar文件?,python,tar,tarfile,Python,Tar,Tarfile,我的上传表单需要一个tar文件,我想检查上传的数据是否有效。该模块支持,但需要一个文件名-我不想浪费资源将文件写入磁盘只是为了检查它是否有效 有没有办法使用标准Python库检查数据是否为有效的tar文件而不写入磁盘?tar文件格式在Wikipedia上 我想最好的办法是检查第一个文件的头校验和是否有效。您可能还希望检查文件名是否健全,但这可能不可靠,具体取决于存储在其中的文件名 在此处复制相关信息: Offset Size Description 0 100 File na
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
通过将头块的无符号字节值与八个校验和字节之和作为ASCII空格(十进制值32)计算校验和
它存储为一个六位八进制数,前导零后跟一个空值,然后是一个空格
各种实现都不遵守这一点,因此依赖于第一个空格修剪的六位数校验和可以产生更好的兼容性。此外,一些历史tar实现将字节视为有符号字节
读者必须双向计算校验和,如果有符号和或无符号和与包含的校验和匹配,则视为正确
还有UStar格式(在该链接中也有详细说明),但是,由于它是旧tar格式的扩展,上面详述的方法应该仍然有效。UStar通常只用于存储关于每个文件的额外信息
或者,由于Python是开源的,您可以查看
是如何工作的,并调整它以检查流而不是文件。源代码在Python-3.1.1/Lib/tarfile.py下提供,但它不适合心脏病患者:-)类tarfile接受fileobj对象。我想您可以传递从web框架获得的任何部分下载实体
__init__(self, name=None, mode='r', fileobj=None)
添加到paxdiablo post:tar是一种非常困难和复杂的文件格式,尽管它看起来很简单。您可以检查基本约束,但是如果您必须支持所有可能存在的tar方言,您将浪费大量时间。其复杂性主要来自以下问题:
- 在事实标准存在之前,没有真正的标准(UStar/pax)
- 规范中的漏洞给供应商留下了灰色区域,每个供应商都实施了自己的解决方案
- 供应商说“我们的焦油更好,它将接管t3h世界”
- 限制,以及这些限制的解决方法(例如文件名长度)
而且,这种格式没有前端头,所以检查整个归档是否正常的唯一方法是完全扫描文件,捕获每条记录,并验证每条记录 tarfile的open
方法在其fileObj
参数中采用类似文件的对象。这可以是一个StringIO
实例假设您上传的数据包含在string数据
中
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文件格式和压缩。文档中提供了更多信息。啊,你比我领先了半分钟:-)不太可能,你的方法是实现同样目标的另一种(可能更好)方法。是否有编码非ASCII文件名的约定?那篇文章提到了这个问题,但没有提到解决方案。这就引出了一个问题:Python的tarfile模块是否支持您在直接检查文件时使用的不同的tar格式?is_tarfile()。