Search code examples
djangodjango-file-upload

Django SuspiciousFileOperation


I have a model that contains a FileField:

class Foo(models.Model):
    fileobj = models.FileField(upload_to="bar/baz")

I am generating a file, and saving it in /tmp/ as part of the save method. This file then needs to be set as the "fileobj" of the model instance.

Currently, I'm trying this:

with open(
    f"/tmp/{self.number}.pdf", "r"
) as h:
    self.fileobj = File(h)

Unfortunately, this fails with: django.core.exceptions.SuspiciousFileOperation:, because the file exists outside of the django project.

I've tried reading the docs, but they didn't help much. Does django take a file, and upon assigning it as a FileField, move it to the media directory, or do I need to manually put it there myself, before attaching it to the model instance. If the second case, what is the point of "upload_to"?


Solution

  • You can use InMemoryUploadedFile object like this.

            import os
            import io
            with open(path, 'rb') as h:
                f = InMemoryUploadedFile(io.BytesIO(h.read()), 'fileobj',
                                         'name.pdf', 'application/pdf',
                                         os.path.getsize(path), None)
                self.fileobj = f