【问题标题】:Django SuspiciousFileOperationDjango 可疑文件操作
【发布时间】:2019-03-27 18:22:34
【问题描述】:

我有一个包含 FileField 的模型:

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

我正在生成一个文件,并将其作为保存方法的一部分保存在 /tmp/ 中。然后需要将该文件设置为模型实例的“fileobj”。

目前,我正在尝试这个:

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

不幸的是,这失败了:django.core.exceptions.SuspiciousFileOperation:,因为该文件存在于 django 项目之外。

我已经尝试阅读文档,但它们并没有太大帮助。 django 是否获取文件,并在将其分配为 FileField 时,将其 移动 到媒体目录,还是我需要自己手动将其放在那里,然后再将其附加到模型实例。如果是第二种情况,“upload_to”的意义何在?

【问题讨论】:

  • 为什么要在 django 中保存 /tmp 文件的路径?它是 linux 上的一个特殊文件位置,因此 1)假设文件将保留在那里是不安全的,并且 2)不能移植到其他操作系统
  • @ritlew 因为我使用 jinja2 将模板渲染为 .tex 文件,并且使用子进程调用 xelatex 输出 pdf,所以这应该立即由 django 保存到 /media/ ,然后删除。

标签: django django-file-upload


【解决方案1】:

您可以像这样使用InMemoryUploadedFile 对象。

        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

【讨论】:

    猜你喜欢
    • 2018-02-22
    • 1970-01-01
    • 2014-10-16
    • 2014-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-09
    • 2017-12-04
    相关资源
    最近更新 更多