Django:控制TemporaryUploadedFile生命的时间

时间:2012-08-06 20:17:02

标签: django file-upload

我的django应用程序中有表单。用户可以在提交表单之前事先上传文件。在上传文件的处理程序中,我使用TemporaryUploadedFile。所以 - 文件存储在/ tmp目录中。此处理程序将响应发送到表单 - JSON对象,其中包含文件路径和文件扩展名。此信息收集在数组中。

提交表单后,此数组将被序列化。这就是问题 - 当表单处理程序接收表单数据和文件名数组并尝试访问这些文件时 - 这里的错误是“没有这样的文件”。

所以,我的问题是 - 如何解决这个问题?也许我可以将这些文件的生命周期设置为更长的时间?或者我应该使用UploadedFile而不是TemporaryUploadedFile。

TIA!

1 个答案:

答案 0 :(得分:3)

TemporaryUploadedFile使用tempfile.NamedTemporaryFilePython docs有这样说:

tempfile.NamedTemporaryFile([mode='w+b'[, bufsize=-1[, suffix=''[, prefix='tmp'[, dir=None[, delete=True]]]]]])
     

此功能有效   正如TemporaryFile()所做的那样,除了保证文件   在文件系统中有一个可见的名称(在Unix上,目录条目   并没有取消联系。可以从name属性中检索该名称   的文件对象。该名称是否可用于打开文件a   第二次,虽然命名的临时文件仍然打开,但各不相同   跨平台(它可以在Unix上使用;它不能在Windows NT上使用   或以后)。 如果delete为true(默认值),则删除该文件   一旦关闭(强调我的)。

     

返回的对象始终是文件属性的类文件对象   是底层的真实文件对象。可以使用此类文件对象   在with语句中,就像普通文件一样。

因此,这里的默认行为是在文件关闭后立即删除文件,它将在初始处理后自动删除。所以你有两个选择。您可以子类化TemporaryUploadedFile并覆盖__init__方法,以便将delete=False传递给tempfile.NamedTemporaryFile(但是当您需要时,需要记住手动删除文件这样做是为了避免累积旧的临时文件),或者您可以确保在处理上传之前将TemporaryUploadedFile移到其他地方,然后重新发送新位置。

使用UploadedFile是不合适的,因为它是一个基类,并不打算实例化。