2010-11-18 4 views
1

J'essaie des scripts CGI en Python. Si une requête arrive à mon script python, comment trouver le type mime du type de fichier?Comment puis-je trouver mime-type en Python

MISE À JOUR: Ajout d'informations Quelques images pour l'instant, image/image.jpg. Mais si je comprends bien, le type mime fait partie des en-têtes que les navigateurs Web envoient, n'est-ce pas? Alors, comment puis-je lire ces en-têtes?

+1

De quel type de fichier? –

+0

Quelques images pour l'instant, http: //adderess/image.jpg. Mais si je comprends bien, «mime-type» fait partie des en-têtes que les navigateurs Web envoient, n'est-ce pas? Alors, comment puis-je lire ces en-têtes? –

Répondre

2

Vous avez deux options. Si vous êtes chanceux, le client peut déterminer le type MIME du fichier et il peut être inclus dans la publication du formulaire. Habituellement, c'est avec la valeur de l'élément d'entrée dont le nom est "filetype" ou quelque chose de similaire.

Sinon, vous pouvez deviner le type MIME à partir de l'extension de fichier sur le serveur. Cela dépend en quelque sorte de la mise à jour du module mimetypes. Notez que vous pouvez ajouter des types ou remplacer des types dans le module. Ensuite, vous utilisez la fonction "guess_type" qui interprète le type mime à partir de l'extension du nom de fichier.

import mimetypes 
mimetypes.add_type('video/webm','.webm') 

... 

    mimetypes.guess_type(filename) 

MISE À JOUR: Si je me souviens bien, vous pouvez obtenir l'interprétation du client du mimetype de l'en-tête « Content-Type ». La plupart du temps, cela se révèle être 'application/octet-stream', ce qui est presque inutile.

Donc, en supposant que vous utilisiez le module cgi, et que vous téléchargiez des fichiers avec la forme multipart habituelle, le navigateur va deviner le type MIME pour vous. Il semble faire un travail décent, et il est passé au paramètre form.type. Ainsi, vous pouvez faire quelque chose comme ceci:

import cgi 
form = cgi.FieldStorage() 
files_types = {}; 
if form.type == 'multipart/form-data': 
    for part in form.keys(): 
     files_types[form[part].filename] = form[part].type 
else: 
    files_types[form.filename] = form.type 
+0

guess_type() ne regarde que l'URL, pas le contenu réel, il ne sera donc aussi précis que vos utilisateurs sont honnêtes, ce qui veut dire que ça ne marchera pas. – Cerin

0

En supposant que vous présentez des fichiers avec un formulaire HTML comme ceci:

<form enctype="multipart/form-data" method="post"> 
    <input name="userfile" type="file" /> 
    <input type="submit" value="Send File" /> 
</form> 

Vous pouvez obtenir le fichier tapez avec ceci dans un script CGI Python:

form = cgi.FieldStorage() 
filetype = form['userfile'].type 

Tenez compte du fait que le s Le type de fichier ubmitted est déterminé par le navigateur Web du client. Il n'est pas détecté par la bibliothèque Python CGI ou le serveur HTTP. Vous pouvez utiliser le module Python mimetypes pour deviner les types MIME à partir des extensions de fichier (par exemple: mimetypes.guess_type(form['userfile'].name)). Vous pouvez également utiliser la commande UNIX file pour obtenir la fiabilité la plus élevée, bien que cela soit généralement trop coûteux.

Questions connexes