【问题标题】:Where does django store temporary upload files?django 在哪里存储临时上传文件?
【发布时间】:2012-05-25 16:33:02
【问题描述】:

我有一个在 CentOS 上运行的 Django/uwsgi/nginx 堆栈。将大文件上传到 django (1GB+) 时,我希望它会在 /tmp 中创建一个临时文件,并且我应该能够看到它随着上传的进行而增长。但是,我没有。 ls -lah /tmp 不显示任何正在创建或更改大小的新文件。我什至在我的settings.py 中明确指定了FILE_UPLOAD_TEMP_DIR = '/tmp',但仍然没有。

如果能帮助我追踪临时文件的存储位置,我将不胜感激。我需要这个来确定是否有任何大型上传正在进行中。

【问题讨论】:

  • 这取决于网络服务器。该请求具有文件的内容。您可以发出 request.read() 来获取内容。 Django 自动有一些解析器来使该文件再次“可用”。
  • 正如我提到的,Web 服务器是 nginx。 Django 对上传的文件有特殊处理。请参阅下面 stevedbrown 答案中的链接。我的问题是临时文件在哪里

标签: django django-uploads


【解决方案1】:

它们存储在系统的临时目录中。来自https://docs.djangoproject.com/en/dev/topics/http/file-uploads/?from=olddocs

上传数据的存储位置

在您保存上传的文件之前,需要将数据存储在某个地方。

默认情况下,如果上传的文件小于 2.5 兆字节,Django 将上传的全部内容保存在内存中。这意味着 保存文件只涉及从内存读取和写入磁盘 因此速度非常快。

但是,如果上传的文件太大,Django 会写 上传文件到存储在系统临时文件中的临时文件 目录。在类 Unix 平台上,这意味着您可以期望 Django 生成一个名为 /tmp/tmpzfp6I6.upload 之类的文件。如果 上传足够大,你可以看到这个文件随着 Django 变大 将数据流式传输到磁盘上。

这些细节 -- 2.5 兆字节; /tmp;等等——简直是“合理的 默认值”。请继续阅读有关如何自定义或完全自定义的详细信息 替换上传行为。

此外,这只发生在给定大小之后,默认为 2.5MB

FILE_UPLOAD_MAX_MEMORY_SIZE 文件的最大大小(以字节为单位) 将被上传到内存中。文件大于 FILE_UPLOAD_MAX_MEMORY_SIZE 将被流式传输到磁盘。

默认为 2.5 兆字节。

【讨论】:

  • 感谢您的信息。不幸的是,它没有回答我的问题,因为正如我所说,问题是ls -lah /tmp 在上传过程中没有显示任何正在创建的临时文件。
  • 另外,您应该确保该进程(不仅仅是您,登录用户)对 /tmp 文件夹或您指向它的任何位置具有写入权限。
【解决方案2】:

我刚刚在我的 OS X 系统上使用 Django 1.4.1 追踪到了这一点。

在 django/core/files/uploadedfile.py 中,使用 django.core.files.temp 创建一个临时文件,作为 tempfile 导入

from django.core.files import temp as tempfile 

这只会返回 Python 的标准 tempfile.NamedTemporaryFile,除非它在 ​​Windows 上运行。

要查看 tempdir 的位置,您可以在 shell 中运行以下命令:

python -c "import tempfile; print tempfile.gettempdir()"

现在在我的系统上,它输出 /var/folders/9v/npjlh_kn7s9fv5p4dwh1spdr0000gn/T,这是我找到临时上传文件的位置。

【讨论】:

    猜你喜欢
    • 2012-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-15
    • 2023-03-25
    • 1970-01-01
    相关资源
    最近更新 更多