据我所知,打开文件只会创建一个文件处理程序,它会占用固定的内存,而不管文件的大小。
Django有一个名为InMemoryUploadedFile
的类型,表示通过表单上传的文件。
我在django视图中获取了我的文件对象的句柄,如下所示:
file_object = request.FILES["uploadedfile"]
此file_object的类型为InMemoryUploadedFile
。
现在我们可以看到,file_object有方法.read()
,用于将文件读入内存。
bytes = file_object.read()
内存中是否已经存在类型为InMemoryUploadedFile
的 file_object ?“
答案 0 :(得分:8)
文件对象上的read()
方法是从文件对象中访问内容的方式,无论该文件是在内存中还是存储在磁盘上。它类似于readlines
或seek
等其他实用程序文件访问方法。
行为类似于built into Python,而后者又是基于操作系统的fread()
方法构建的。
从文件中读取最多大小字节(如果读取命中EOF,则更少) 在获得大小字节之前)。如果size参数为负数或 省略,读取所有数据,直到达到EOF。字节返回为 一个字符串对象。遇到EOF时返回空字符串 立即。 (对于某些文件,比如ttys,继续是有意义的 在EOF被击中后读取。)注意这种方法可以调用 潜在的C函数fread()不止一次努力获取 尽可能接近大小字节。还要注意,在 非阻塞模式,甚至可以返回比请求的数据少的数据 如果没有给出尺寸参数。
关于InMemoryUploadedFile
的确切位置问题,它是bit more complicated。
在保存上传的文件之前,需要将数据存储在某处。
默认情况下,如果上传的文件小于2.5兆字节,则为Django 将上传的全部内容保存在内存中。这意味着 保存文件只涉及从内存中读取和写入磁盘 因此非常快。
但是,如果上传的文件太大,Django会写 将文件上传到存储在系统临时文件中的临时文件 目录。在类似Unix的平台上,这意味着你可以期待Django 生成一个名为/tmp/tmpzfp6I6.upload的文件。如果 上传足够大,你可以看到这个文件的大小增长为Django 将数据流式传输到磁盘上。
这些细节 - 2.5兆字节;的/ tmp;等 - 简单地“合理 默认值”。请继续阅读有关如何自定义或完全自定义的详细信息 替换上传行为。
答案 1 :(得分:2)