Processing file uploads before object is saved

后端 未结 3 1393
情书的邮戳
情书的邮戳 2020-12-30 16:17

I\'ve got a model like this:

class Talk(BaseModel):
  title        = models.CharField(max_length=200)
  mp3          = models.FileField(upload_to = u\'talks/         


        
相关标签:
3条回答
  • 2020-12-30 17:01

    You can access the file data in request.FILES while in your view.

    I think that best way is to bind uploaded files to a form, override the forms clean method, get the UploadedFile object from cleaned_data, validate it anyway you like, then override the save method and populate your models instance with information about the file and then save it.

    0 讨论(0)
  • 2020-12-30 17:07

    You could follow the technique used by ImageField where it validates the file header and then seeks back to the start of the file.

    class ImageField(FileField):
        # ...    
        def to_python(self, data):
            f = super(ImageField, self).to_python(data)
            # ...
            # We need to get a file object for Pillow. We might have a path or we might
            # have to read the data into memory.
            if hasattr(data, 'temporary_file_path'):
                file = data.temporary_file_path()
            else:
                if hasattr(data, 'read'):
                    file = BytesIO(data.read())
                else:
                    file = BytesIO(data['content'])
    
            try:
                # ...
            except Exception:
                # Pillow doesn't recognize it as an image.
                six.reraise(ValidationError, ValidationError(
                    self.error_messages['invalid_image'],
                    code='invalid_image',
                ), sys.exc_info()[2])
            if hasattr(f, 'seek') and callable(f.seek):
                f.seek(0)
            return f
    
    0 讨论(0)
  • 2020-12-30 17:22

    a cleaner way to get the file before be saved is like this:

    from django.core.exceptions import ValidationError
    
    #this go in your class Model
    def clean(self):
        try:
            f = self.mp3.file #the file in Memory
        except ValueError:
            raise ValidationError("A File is needed")
        f.__class__ #this prints <class 'django.core.files.uploadedfile.InMemoryUploadedFile'>
        processfile(f)
    

    and if we need a path, ther answer is in this other question

    0 讨论(0)
提交回复
热议问题