2009-11-24 6 views
6

내 업로드 양식에 tar 파일이 필요하며 업로드 된 데이터가 유효한지 확인하고 싶습니다. tarfile 모듈은 is_tarfile()을 지원하지만 파일 이름이 필요합니다. 파일이 유효한지 확인하기 위해 디스크에 파일을 쓰는 것을 낭비하고 싶지 않습니다.데이터가 파일없이 유효한 tar 파일인지 확인하는 방법은 무엇입니까?

데이터를 확인하는 방법은 표준 파이썬 라이브러리를 사용하여 디스크에 쓰지 않고 유효한 tar 파일입니까?

답변

3

업로드 된 데이터가 문자열 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 설명서를 참조하십시오.

+0

이것은 질문을 제기합니다. 파이썬의 tarfile 모듈은 파일을 직접 확인할 때 is_tarfile()을 사용하여 다른 tar 형식을 지원합니까? – Shule

+2

@Shule이 질문에 답하기 위해 ['is_tarfile()'] (https://hg.python.org/cpython/file/2.7/Lib/tarfile.py#l2616)의 모듈 소스 코드를 살펴볼 수 있습니다. . – mhawke

4

tar 파일 형식은 위키 백과에서 here입니다.

가장 좋은 방법은 첫 번째 파일의 헤더 체크섬이 유효한지 확인하는 것입니다. 온전한 파일 이름을 확인하고 거기에 저장된 파일 이름에 따라 안정적이지 않을 수도 있습니다.

여기 관련 정보를 복제 :

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로 찍은 여덟 체크섬 바이트 헤더 블록의 부호 바이트 값의 합을 취함으로써 계산된다).

여덟 자리 8 진수로 저장되며 앞에 0이오고 그 다음에 공백이옵니다.

다양한 구현이이를 준수하지 않으므로 체크섬을 위해 여백을 줄인 첫 번째 공백을 사용하면 호환성이 향상됩니다. 또한 일부 역사적인 tar 구현은 바이트를 서명으로 처리했습니다.

독자는 체크섬을 두 가지 방법으로 계산해야하며 서명 된 합계 또는 서명되지 않은 합계가 포함 된 체크섬과 일치하는 경우 양호한 것으로 간주해야합니다.

또한 기존의 tar 형식의 확장이기 때문에 UStar 형식 (해당 링크에도 설명되어 있음)이 있지만 위에서 설명한 방법은 계속 작동해야합니다. UStar는 일반적으로 각 파일에 대한 추가 정보를 저장하기위한 용도로만 사용됩니다.

파이썬은 오픈 소스이기 때문에 is_tarfile의 작동 방식을보고 파일이 아닌 스트림을 확인하도록 조정할 수 있습니다. 소스 코드는 here 아래 Python-3.1.1/Lib/tarfile.py이지만 마음이 희미하지는 않습니다 :-)

+0

비 ASCII 파일 이름을 인코딩하는 규칙이 있습니까? 이 기사는 문제를 언급하고 있지만 해결책은 언급하지 않았습니다. –

3

클래스 TarFile은 fileobj 개체를 허용합니다. 웹 프레임 워크에서 가져온 부분 다운로드 엔티티를 전달할 수 있습니다.

paxdiablo 글에 추가 : tar는 명백한 단순성에도 불구하고 매우 복잡하고 복잡한 파일 형식입니다. 기본 제약 조건을 확인할 수는 있지만 가능한 모든 기존 타르 방언을 지원해야한다면 많은 시간을 낭비하게됩니다. 복잡성의 대부분은 다음과 같은 문제에서 온다 : 사실상의 표준까지 실제 표준의

  • 부재가 (USTAR/인원) 사양에
  • 구멍 하나 하나가 자신의 구현 어디에 업체에게 회색 영역을 떠나는 존재 솔루션
  • "타르가 더 좋으며 t3h 세계를 대신합니다"라고 말하는 공급 업체
  • 제한 사항 및 해결 방법 (예 :파일 이름 길이)

또한 형식이 선행 헤더가 없으므로 전체 보관 파일이 정상적인지 확인하는 유일한 방법은 파일을 완전히 스캔하고 각 레코드를 캐치하고 각 레코드를 확인하는 것입니다.

+0

아, 당신은 반쯤 내게 두들겨 :-) –

+0

정말로, 당신의 방법은 같은 것을 달성하는 또 다른 (아마 더 좋은) 방법입니다. –

3

의 방법은 fileObj 인수에서 파일과 유사한 객체를 사용합니다. StringIO 인스턴스

관련 문제