如何确定数据是否是没有文件的有效tar文件?

hoj*_*oju 6 python tar tarfile

我的上传表单需要一个tar文件,我想检查上传的数据是否有效.该tar文件模块支持is_tarfile(),但预计一个文件名-我不想浪费资源写入到磁盘文件只是为了检查它是否有效.

有没有办法使用标准的Python库检查数据是否是有效的tar文件而无需写入磁盘?

pax*_*blo 5

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
Run Code Online (Sandbox Code Playgroud)

通过将标头块的无符号字节值与八个校验和字节的总和取为ASCII空间(十进制值32)来计算校验和。

它存储为六位数的八进制数字,前导零,后跟一个空值和一个空格。

各种实现均不遵循此要求,因此,依靠将第一个空格修整后的六位数字作为校验和可获得更好的兼容性。另外,一些历史性的tar实现将字节视为已签名。

读者必须同时计算两种校验和,并且如果有符号和无符号总和与所包含的校验和匹配,则将其视为良好。

还有UStar格式(在该链接中也有详细介绍),但是,由于它是对旧tar格式的扩展,因此上面详述的方法仍然可以使用。UStar通常仅用于存储有关每个文件的额外信息。

另外,由于Python是开源的,因此您可以了解其is_tarfile工作原理并对其进行调整以检查流而不是文件。源代码可以下面找到,Python-3.1.1/Lib/tarfile.py但不是出于胆小:-)


mha*_*wke 3

假设您上传的数据包含在 string 中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"
Run Code Online (Sandbox Code Playgroud)

还有其他复杂性,例如处理不同的 tar 文件格式和压缩。更多信息可在tarfile文档中找到。

  • @Shule要回答这个问题,您可以查看 [`is_tarfile()`](https://hg.python.org/cpython/file/2.7/Lib/tarfile.py#l2616) 的模块源代码。 (2认同)