2

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

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

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

蒂亚!

4

1 回答 1

4

TemporaryUploadedFile使用tempfile.NamedTemporaryFile. Python 文档有这样的说法:

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

此函数的操作与 TemporaryFile() 完全一样,除了文件保证在文件系统中具有可见名称(在 Unix 上,目录条目未取消链接)。该名称可以从文件对象的名称属性中检索。在命名的临时文件仍处于打开状态时,是否可以使用该名称再次打开文件,因平台而异(在 Unix 上可以这样使用;在 Windows NT 或更高版本上不能)。如果 delete 为真(默认),则文件一关闭就会被删除(强调我的)。

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

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

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

于 2012-08-06T21:11:20.853 回答