我在这里有以下情况。我的操作系统显示我通过POST请求得到的django TemporaryUploadedFile
不再存在,但不知何故可以读取这个上传的文件。
这是代码
text_file = request.FILES['text_file']
print(text_file.temporary_file_path())
os.system('ls -l ' + text_file.temporary_file_path())
fs = FileSystemStorage()
file_new =fs.save(text_file.name, text_file)
print(text_file.temporary_file_path())
os.system('ls -l ' + text_file.temporary_file_path())
fs.delete(file_new)
for chunk in text_file.chunks():
text += chunk.decode(encoding)
print('Got text OK.')
这给出了以下输出:
/tmp/tmp0tngal9t.upload foo.txt
-rw------- 1 mine machine 3072889 oct 18 19:29 /tmp/tmp0tngal9t.upload
/tmp/tmp0tngal9t.upload foo.txt
ls: cannot access '/tmp/tmp0tngal9t.upload': No such file or directory
Got text OK.
所以TemporaryUploadedFile
在保存到file_new
之后就会消失,之后也会被删除。无论如何,text_file
被块成功读取,我从上传的foo.txt
文件中获取所有文本。怎么可能?如果text_file.chunks()
不再存在,text_file
从何处获取数据?
我用:
python 3.5.2
django 1.10.2
ubuntu 16.04.1
答案 0 :(得分:0)
我发现这个问题仍然存在于裸python中,所以它与django没有特别的关系,因为在这个例子中我只读了text_file
中打开的request.FILES['text_file']
。
我重新问了类似的问题here,只关注python。事实证明,问题与python没有太大关系,但是使用Linux / Unix系统文件管理。我在这里引用answer of Jean-François Fabre:
与Python无关。在C,Fortran或Visual Cobol中你有 只要代码从打开处获取其句柄,就会出现相同的行为 系统调用。
在Linux / Unix系统上,一旦进程具有文件句柄,它就可以 读取它,即使文件被删除。有关详细信息,请检查 问题(我不确定是否可以这样做,似乎是)
在Windows上,只要能够删除该文件,就无法删除该文件 它被一个过程锁定了。