【问题标题】:Django TemporaryUploadedFile does not exist but nevertheless it is read successfullyDjango TemporaryUploadedFile 不存在,但已成功读取
【发布时间】:2016-10-18 20:37:24
【问题描述】:

我这里有以下情况。我的操作系统显示我通过 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 不再存在,text_file.chunks() 从哪里获取数据?

我用:

  • python 3.5.2
  • django 1.10.2
  • ubuntu 16.04.1

【问题讨论】:

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


    【解决方案1】:

    我发现这个问题仍然存在于裸 python 中,所以它与 django 并没有特别的关系,因为在这个例子中我刚刚阅读了text_file,它们在request.FILES['text_file'] 中打开。

    我重新问了类似的问题here,只关注python。事实证明,这个问题也不是与 python 相关,而是与 Linux/Unix 系统文件管理有关。我在这里引用answer of Jean-François Fabre

    与 Python 无关。在 C、Fortran 或 Visual Cobol 中,您将拥有 只要代码从 open 获取句柄,行为相同 系统调用。

    在 Linux/Unix 系统上,一旦一个进程拥有一个文件的句柄,它就可以 阅读它,即使文件被删除。有关更多详细信息,请检查 问题(我不确定这样做是否可以,似乎可以)

    在 Windows 上,您将无法删除文件,只要 它被进程锁定了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-22
      • 2019-05-31
      • 2018-09-09
      • 1970-01-01
      • 2011-10-15
      • 1970-01-01
      相关资源
      最近更新 更多