Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何确定数据在没有文件的情况下是否是有效的tar文件?_Python_Tar_Tarfile - Fatal编程技术网

Python 如何确定数据在没有文件的情况下是否是有效的tar文件?

Python 如何确定数据在没有文件的情况下是否是有效的tar文件?,python,tar,tarfile,Python,Tar,Tarfile,我的上传表单需要一个tar文件,我想检查上传的数据是否有效。该模块支持,但需要一个文件名-我不想浪费资源将文件写入磁盘只是为了检查它是否有效 有没有办法使用标准Python库检查数据是否为有效的tar文件而不写入磁盘?tar文件格式在Wikipedia上 我想最好的办法是检查第一个文件的头校验和是否有效。您可能还希望检查文件名是否健全,但这可能不可靠,具体取决于存储在其中的文件名 在此处复制相关信息: Offset Size Description 0 100 File na

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

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

tar文件格式在Wikipedia上

我想最好的办法是检查第一个文件的头校验和是否有效。您可能还希望检查文件名是否健全,但这可能不可靠,具体取决于存储在其中的文件名

在此处复制相关信息:

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()。