Еще нет того, насколько я знаю. Друг и я работаем над Windows с открытым исходным кодом epoll реализация (ссылка ниже), но мы сталкиваемся с проблемами, выясняющими, как заставить его действовать то же как реализация Linux.
Текущие препятствия:
я попытаюсь возвратиться и обновить это сообщение, поскольку мы делаем успехи с проектом.
Допустим, ваши загруженные данные содержатся в строке 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 .
Формат 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
Контрольная сумма вычисляется путем взятия суммы значений байтов без знака в блоке заголовка, причем восемь байтов контрольной суммы считаются пробелами ASCII (десятичное значение 32).
Оно сохраняется как шестизначное восьмеричное число с ведущими нулями, за которыми следует ноль, а затем пробел.
. Различные реализации этого не придерживаются, поэтому использование первых шести знаков пробела для контрольной суммы дает лучшую совместимость. К тому же, некоторые исторические реализации tar обрабатывают байты как подписанные.
Читатели должны вычислять контрольную сумму в обоих направлениях и рассматривать ее как правильную, если сумма со знаком или без знака совпадает с включенной контрольной суммой.
Существует также формат UStar (также подробно описанный в эту ссылку), но, поскольку это расширение старого формата tar, метод, описанный выше, должен работать. UStar обычно предназначен для хранения дополнительной информации о каждом файле.
В качестве альтернативы, поскольку Python является открытым исходным кодом, вы можете увидеть, как работает is_tarfile
, и адаптировать его для проверки вашего потока, а не файла. Исходный код доступен здесь в разделе Python-3.1.1 / Lib / tarfile.py
, но он не для слабонервных: -)
Существует также формат UStar (также подробно описанный в этой ссылке), но, поскольку это расширение старого формата tar, метод, описанный выше, должен все еще работают. UStar обычно предназначен для хранения дополнительной информации о каждом файле.
В качестве альтернативы, поскольку Python является открытым исходным кодом, вы можете увидеть, как работает is_tarfile
, и адаптировать его для проверки вашего потока, а не файла. Исходный код доступен здесь в разделе Python-3.1.1 / Lib / tarfile.py
, но он не для слабонервных: -)
Существует также формат UStar (также подробно описанный в этой ссылке), но, поскольку это расширение старого формата tar, метод, описанный выше, должен все еще работают. UStar обычно предназначен для хранения дополнительной информации о каждом файле.
В качестве альтернативы, поскольку Python является открытым исходным кодом, вы можете увидеть, как работает is_tarfile
, и адаптировать его для проверки вашего потока, а не файла. Исходный код доступен здесь в разделе Python-3.1.1 / Lib / tarfile.py
, но он не для слабонервных: -)
В качестве альтернативы, поскольку Python является открытым исходным кодом, вы можете увидеть, как работает is_tarfile
, и адаптировать его для проверки вашего потока, а не файла. Исходный код доступен здесь в разделе Python-3.1.1 / Lib / tarfile.py
, но он не для слабонервных: -)
В качестве альтернативы, поскольку Python является открытым исходным кодом, вы можете увидеть, как работает is_tarfile
, и адаптировать его для проверки вашего потока, а не файла. Исходный код доступен здесь в разделе Python-3.1.1 / Lib / tarfile.py
, но он не для слабонервных: -)
Метод open
для tarfile
принимает файловый объект в своем аргументе fileObj
. Это может быть экземпляр StringIO
Класс TarFile принимает объект fileobj. Я предполагаю, что вы можете передать любой объект частичной загрузки, который вы получаете из своего веб-фреймворка.
__init__(self, name=None, mode='r', fileobj=None)
Добавление к сообщению paxdiablo: tar - очень сложный и сложный формат файла, несмотря на его кажущуюся простоту. Вы можете проверить базовое ограничение, но если вам нужно поддерживать все возможные существующие диалекты tar, вы потратите много времени. Большая часть ее сложности проистекает из следующих проблем:
Кроме того, формат не имеет предварительного заголовка, поэтому единственный способ проверить, в порядке ли весь архив, - это полностью просканировать файл, перехватить каждую запись и проверить каждую.