我的django应用程序中有表单。用户可以在提交表单之前事先上传文件。在上传文件的处理程序中,我使用TemporaryUploadedFile。所以 - 文件存储在/ tmp目录中。此处理程序将响应发送到表单 - JSON对象,其中包含文件路径和文件扩展名。此信息收集在数组中。
提交表单后,此数组将被序列化。这就是问题 - 当表单处理程序接收表单数据和文件名数组并尝试访问这些文件时 - 这里的错误是“没有这样的文件”。
所以,我的问题是 - 如何解决这个问题?也许我可以将这些文件的生命周期设置为更长的时间?或者我应该使用UploadedFile而不是TemporaryUploadedFile。
TIA!
答案 0 :(得分:3)
TemporaryUploadedFile
使用tempfile.NamedTemporaryFile
。 Python 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
是不合适的,因为它是一个基类,并不打算实例化。