2014-12-16 6 views
0

У меня есть приложение Django, которое создает файл .tar.gz для загрузки. Локально я запускаю на своем dev машине Python 2.7 и на моем удаленном сервере dev, Python 2.6.6. Когда я загружаю файлы, я могу открыть их через Mac Finder/command line и просмотреть содержимое. Тем не менее, Python 2.7 не нравится файл .tar.gz, созданный на моем удаленном сервере dev ... и мне нужно загрузить эти файлы на сайт, который использует Python для распаковки/разбора архивов. Как я могу отладить, что не так? В оболочке Python:Python tarfile не создает файл .tar.gz

>>> tarfile.is_tarfile('myTestFile_remote.tar.gz') 
False 

>>> tarfile.is_tarfile('myTestFile_local.tar.gz') 
True 

>>> f = tarfile.open('myTestFile_remote.tar.gz', 'r:gz') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/tarfile.py", line 1678, in open 
    return func(name, filemode, fileobj, **kwargs) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/tarfile.py", line 1727, in gzopen 
    **kwargs) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/tarfile.py", line 1705, in taropen 
    return cls(name, mode, fileobj, **kwargs) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/tarfile.py", line 1574, in __init__ 
    self.firstmember = self.next() 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/tarfile.py", line 2331, in next 
    raise ReadError(str(e)) 
tarfile.ReadError: invalid header 

Из this SO question, я также попытался запустить gzip -t против удаленного файла, но не выход (который я считаю, не означает, что файл в порядке). Из this other SO question, я побежал file myTestFile_remote.tar.gz, и я считаю, что вывод показывает правильный формат файла:

myTestFile_remote.tar.gz: gzip compressed data, from Unix 

Я не совсем уверен, что еще я могу попробовать. Кажется, что исключение выбрано потому, что у моего tarfile есть self.offset == 0, но я не знаю, что это значит, и я не понимаю, как создать tarfile, чтобы этого не произошло. Предложения приветствуются ...

Не знаете, какой код был бы полезен здесь. Мой код, чтобы создать и вернуть файл обработан:

zip_filename = '%s_%s.tar.gz' % (course.name, course.url) 
s = cStringIO.StringIO() 
zf = tarfile.open(zip_filename, mode='w:gz', fileobj=s) 

<add a bunch of stuff> 

zipped = zip_collection(zip_data) 
zf.close() 

if zipped: 
    response = HttpResponse(content_type="application/tar") 
    response['Content-Disposition'] = 'attachment; filename=%s' % zip_filename 
    s.seek(0, os.SEEK_END) 
    response.write(s.getvalue()) 

------ ОБНОВЛЕНИЕ ------ Per this SO post, я также проверил, что удаленный файл является tar.gz файл, используя tar -zxvf myTestFile_remote.tar.gz из командной строки. Файл извлекается просто отлично.

+0

Что вы добавляете к смоле? – sax

+0

Файлы изображений, документы XML, файлы HTML. Как локальные, так и удаленные добавить файлы того же типа ... – user

+0

вы закрыли tarfile? – tdelaney

ответ

2

Я думаю, проблема в zlib, а не в самом tarfile.

Обходные:

  • создать файл с помощью bz2
    tarfile.open(zip_filename, mode='w:bz2', fileobj=s)

  • усилия уровень сжатия (и запись/чтение)

    zf = tarfile.open(zip_filename, mode='w:gz', fileobj=s, compresslevel=9)

    zf = tarfile.open(zip_filename, mode='r:gz', compresslevel=9)

  • низкий уровень сжатия, пока проблема не исчезнет

    zf = tarfile.open(zip_filename, mode='w:gz', fileobj=s, compresslevel=[9-0])

  • полностью удалить Компрессионные

    tarfile.open(zip_filename, mode='w', fileobj=s)

последний один только если сжатие абсолютно необходимо и ни одна из предыдущих работ:

f = open(zip_filename, "w") 
proc = subprocess.Popen(["gzip", "-9"], stdin=subprocess.PIPE, stdout=fobj) 
tar = tarfile.open(fileobj=proc.stdin, mode="w|") 
tar.add(...) 
tar.close() 
proc.stdin.close() 
f.close()