2011-01-31 28 views
11

¿Hay alguna forma de obtener el tipo de contenido de un archivo de carga al sobrescribir el método de guardar modelos? He intentado esto:Django - Obtener el tipo de archivo/mimetipo cargado

def save(self): 
    print(self.file.content_type) 
    super(Media, self).save() 

Pero no funcionó. En este ejemplo, self.file es un model.FileField:

file = models.FileField(upload_to='uploads/%m-%Y/') 

Editar: Quiero ser capaz de guardar el tipo de contenido a la base de datos, así que lo que necesita antes de que el almacenamiento se haya hecho :) completa

+0

creo que el archivo se guarda después de la memorización() está hecho. Podría estar equivocado. Intente dar la vuelta a la segunda y a la tercera línea, de modo que guarde() e imprima(). – dotty

+0

Eso funcionó, pero voy a tener que obtener los datos de antemano ya que quiero guardar el tipo de contenido en la base de datos. Debería haber mencionado eso en la pregunta original. – Hanpan

+0

Así que guárdelo, obtenga el tipo de mimo, complete su campo de tipo de contenido, luego súper (...). Guarde de nuevo. Debería funcionar solo como actualizar. – Spacedman

Respuesta

25
class MyForm(forms.ModelForm): 

    def clean_file(self): 
     file = self.cleaned_data['file'] 
     try: 
      if file: 
       file_type = file.content_type.split('/')[0] 
       print file_type 

       if len(file.name.split('.')) == 1: 
        raise forms.ValidationError(_('File type is not supported')) 

       if file_type in settings.TASK_UPLOAD_FILE_TYPES: 
        if file._size > settings.TASK_UPLOAD_FILE_MAX_SIZE: 
         raise forms.ValidationError(_('Please keep filesize under %s. Current filesize %s') % (filesizeformat(settings.TASK_UPLOAD_FILE_MAX_SIZE), filesizeformat(file._size))) 
       else: 
        raise forms.ValidationError(_('File type is not supported')) 
     except: 
      pass 

     return file 

settings.py

TASK_UPLOAD_FILE_TYPES = ['pdf', 'vnd.oasis.opendocument.text','vnd.ms-excel','msword','application',] 
TASK_UPLOAD_FILE_MAX_SIZE = "5242880" 
+1

¿Cómo se llama clean_file? –

+0

clean_file generalmente se invoca cuando necesita validar el formulario con is_valid() –

+4

Creo que excepto debe capturar un AttributeError. De lo contrario, ¿no se tragarán las formas.ValidationError? –

5

de acuerdo con la documentación, el código de la vista que maneja el formulario de carga debe ser capaz de obtener los MIME (con salvedades) en bits de request.FILES

la pieza final del rompecabezas es el manejo del archivo real datos de request.FILES. Cada entrada en este diccionario es un objeto UploadedFile - un simple contenedor alrededor de un archivo cargado. Por lo general, utiliza uno de estos métodos para acceder al contenido subido : UploadedFile¶

clase Además de las heredadas de archivo, todos los objetos UploadedFile definen los siguientes métodos /atributos:

UploadedFile .content_type El encabezado de tipo de contenido cargado con el archivo (por ejemplo, texto/plano o application/pdf). Al igual que cualquier dato suministrado por el usuario, no debe confiar en que el archivo cargado es en realidad este tipo. Todavía necesitará para validar que el archivo contiene el contenido que el encabezado de tipo de contenido afirma: "confíe pero verifique".

Esto es todo aquí: http://docs.djangoproject.com/en/1.2/topics/http/file-uploads/ (aunque corté n pegar de los documentos anteriormente dev ...)

no puedo ver un content_type en el modelo FileField s en absoluto en los documentos ...

Cuestiones relacionadas