Django: Valider le type de fichier du fichier téléchargé
J'ai une application qui permet aux gens de télécharger des fichiers, représenté comme UploadedFiles
. Cependant, je tiens à vous assurer que les utilisateurs d'uploader des fichiers xml. Je sais que je peux le faire à l'aide de magic
, mais je ne sais pas où mettre cette check - je ne peux pas le mettre dans le clean
fonction depuis le fichier n'est pas encore téléchargé lorsque clean
pistes, autant que je peux dire.
Voici la UploadedFile
modèle:
class UploadedFile(models.Model):
"""This represents a file that has been uploaded to the server."""
STATE_UPLOADED = 0
STATE_ANNOTATED = 1
STATE_PROCESSING = 2
STATE_PROCESSED = 4
STATES = (
(STATE_UPLOADED, "Uploaded"),
(STATE_ANNOTATED, "Annotated"),
(STATE_PROCESSING, "Processing"),
(STATE_PROCESSED, "Processed"),
)
status = models.SmallIntegerField(choices=STATES,
default=0, blank=True, null=True)
file = models.FileField(upload_to=settings.XML_ROOT)
project = models.ForeignKey(Project)
def __unicode__(self):
return self.file.name
def name(self):
return os.path.basename(self.file.name)
def save(self, *args, **kwargs):
if not self.status:
self.status = self.STATE_UPLOADED
super(UploadedFile, self).save(*args, **kwargs)
def delete(self, *args, **kwargs):
os.remove(self.file.path)
self.file.delete(False)
super(UploadedFile, self).delete(*args, **kwargs)
def get_absolute_url(self):
return u'/upload/projects/%d' % self.id
def clean(self):
if not "XML" in magic.from_file(self.file.url):
raise ValidationError(u'Not an xml file.')
class UploadedFileForm(forms.ModelForm):
class Meta:
model = UploadedFile
exclude = ('project',)
stackoverflow.com/questions/6460848/...
Mais il est hautement inefficace - je pourrais le titre d'un fichier tout ce que je veux.
Droite, ce que vérifie l'extension, mais vous pouvez l'utiliser comme base pour valider le fichier, telles que l'ouverture et la vérification de la validité de l'xml.
Le fichier est téléchargé lorsque
Jetez un oeil à Mikkos réponse et la façon dont il gère les formes nettoyé (post) de données qui contient le téléchargement de la filedata.
Mais il est hautement inefficace - je pourrais le titre d'un fichier tout ce que je veux.
Droite, ce que vérifie l'extension, mais vous pouvez l'utiliser comme base pour valider le fichier, telles que l'ouverture et la vérification de la validité de l'xml.
Le fichier est téléchargé lorsque
clean
fonctionne?Jetez un oeil à Mikkos réponse et la façon dont il gère les formes nettoyé (post) de données qui contient le téléchargement de la filedata.
OriginalL'auteur Plasma | 2013-11-28
Vous devez vous connecter pour publier un commentaire.
De valider les fichiers est régulièrement question, donc je voudrais utiliser un validateurs:
Ensuite, vous pouvez utiliser
FileValidator
dans votremodel.FileField
ouforms.FileField
comme suit:data.seek(0)
aprèscontent_type = magic.from_buffer(data.read(), mime=True)
de sorte que déposée peut être lu à nouveau dans la vue ou gestionnaire de fichier sans demander expressément à 0.à travers une recherche sur google trouvé ce pypi.python.org/pypi/django-validated-file/2.0 est-ce que vous avez décrit ci-dessus
Pourquoi ajoutez-vous une
@deconstructible
décorateur à la classe?OriginalL'auteur Sultan Alotaibi
Pour la postérité: la solution est d'utiliser la
read
méthode et passer àmagic.from_buffer
.OriginalL'auteur Plasma
De django 1.11, vous pouvez également utiliser FileExtensionValidator.
Remarque: ceci doit être utilisé sur un FileField et ne fonctionnera pas sur un CharField (par exemple), depuis le programme de validation valide sur la valeur.nom.
ref: https://docs.djangoproject.com/en/dev/ref/validators/#fileextensionvalidator
OriginalL'auteur rbennell
Je pense que ce que vous voulez faire est de nettoyer le fichier téléchargé dans Django
Form.clean_your_field_name_here()
méthodes - les données sont disponibles sur votre système puis, si elle était présentée comme normale requête HTTP POST.Aussi, si vous considérez que c'est inefficace explorer les options des différents Django de téléchargement de fichiers backend et comment faire du streaming de traitement.
Si vous avez besoin de prendre en compte la sécurité du système lorsque vous traitez avec les téléchargements
Assurez-vous téléchargé le fichier a l'extension correcte
Assurez-vous que le type mime correspond à l'extension de fichier
Dans le cas où vous êtes inquiet au sujet de l'utilisateur de téléchargement d'exploiter des fichiers (pour les attaques à l'encontre de votre site)
De réécrire tout le contenu du fichier sur enregistrer pour se débarrasser de possible en sus (exploiter) charge utile (si vous ne pouvez pas incorporer HTML en XML dont le navigateur interprète comme un site d'origine HTML fichier lors du téléchargement)
Assurez-vous que vous utilisez-tête content-disposition en téléchargement
Certains plus d'infos ici: http://opensourcehacker.com/2013/07/31/secure-user-uploads-and-exploiting-served-user-content/
Ci-dessous est mon exemple comment j'ai désinfecter les images téléversées:
modelForm
pour monUploadedFile
modèle (voir mon OP), et je ne sais pas où je peux mettreclean_file
. Si je l'ai mis à l'extérieur demeta
, j'obtiens une erreur javascript que j'utilise pour télécharger le fichier. À l'intérieur demeta
, il ne semble pas s'exécuter.Ou je suppose que mon vrai problème, c'est que le
file
est encore dans la mémoire (c'est unInMemoryUploadedFile
objet), donc je ne vois pas comment je peux courir aucun contrôle sur le fichier.OriginalL'auteur Mikko Ohtamaa