8
votes

Comment déterminer si des données sont un fichier tar valide sans fichier?

Mon formulaire de téléchargement s'attend à ce qu'un fichier tar et que je souhaite vérifier si les données téléchargées sont valides. Tarfile Module prend en charge is_tarfile () , mais s'attend à un nom de fichier - Je ne veux pas gaspiller des ressources en rédaction du fichier à disque juste pour vérifier s'il est valide.

Y a-t-il un moyen de vérifier que les données sont un fichier tar valide sans écrire sur le disque, à l'aide des bibliothèques Python standard?


0 commentaires

4 Réponses :


5
votes

Le format de fichier tar est ici sur Wikipedia.

i Suspect Votre meilleur pari serait de vérifier que la somme de contrôle en-tête du premier fichier est valide. Vous pouvez également vouloir vérifier le nom du fichier pour la santé mentale mais qui peut ne pas être fiable, en fonction des noms de fichiers stockés là-bas. P>

Dupliquer les informations pertinentes ici: P>

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


1 commentaires

Existe-t-il une convention pour coder les noms de fichiers non-ASCII? Cet article mentionne le problème, mais ne mentionne pas une solution.



3
votes

La classe Tarfile accepte un objet FileObj. Je suppose que vous pouvez transmettre n'importe quelle entité de téléchargement partielle que vous obtenez de votre webcadre Web. XXX

Ajout à PaxDiablo Post: Tar est un format de fichier très difficile et complexe, malgré sa simplicité apparente. Vous pouvez vérifier la contrainte de base, mais si vous devez prendre en charge tous les dialectes de gare existants possibles, vous allez perdre beaucoup de temps. La majeure partie de sa complexité provient des problèmes suivants:

  • absence d'une norme réelle jusqu'à ce qu'une norme de facto existait (USTAR / PAX)
  • trous dans la spécification laissant des fournisseurs zones grises dans lesquelles chacun a mis en œuvre sa propre solution
  • Vendeurs disant "Notre goudron est meilleur et il prendra plus de T3H World"
  • limitations et de contvences pour ces limitations (par exemple la longueur du nom de fichier)

    En outre, le format n'a pas d'en-tête initial, donc le seul moyen de vérifier si l'unique archive est sain d'esprit consiste à numériser complètement le fichier, à attraper chaque enregistrement et à valider chacun.


2 commentaires

Ah, tu m'as battu à une demi-minute :-)


Pas vraiment, votre méthode est une autre voie (probablement mieux) d'obtenir la même chose.



3
votes

Le Ouvrir méthode de Tarfile prend un objet ressemblant à un fichier dans son FileObj argument. Cela peut être un stringio instance


0 commentaires

3
votes

Dites que vos données téléchargées sont contenues dans la chaîne DATA CODE>.

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"


2 commentaires

Cela pose la question suivante: Le module Tarfile de Python prend-il en charge les différents formats de goudron dont vous parlez avec IS_TARFILE () lors de la vérification des fichiers directement?


@Shule Pour répondre à cette question, vous pouvez consulter le code source du module pour is_tarfile () .