Django TemporaryUploadedFile不存在,但成功读取

时间:2016-10-18 20:37:25

标签: python linux django file-upload temporary-files

我在这里有以下情况。我的操作系统显示我通过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

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上,只要能够删除该文件,就无法删除该文件   它被一个过程锁定了。