为什么连续上载同一个文件时会收到空的InMemoryUploadedFile对象

2024-10-06 11:27:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个脚本,它向Django发送POST请求以上载文件。它无限期运行并上传一个文件“file1.csv”。在

files ={"uploadedfile": ("file1.csv", open("file1.csv", 'rb'))}
requests.post(url, files=files)

现在,当django第一次收到file1.csv时,我可以读取内容,并且大小不为零。在

^{pr2}$

输出:

File size: 1758

但是当我在一个新的POST请求中第二次收到该文件时(因为上载脚本正在无限循环中运行),文件是空的。在

File size: 0

我不明白这种行为。有什么想法吗?在

我试着上传多个不同的文件。每当同一个文件在第一次上传n次之后,InMemoryUploadedFile对象总是空的。在

为什么?在


Tags: 文件csvdjango脚本sizefilesopenpost
3条回答

只需做file.seek(0)。那会解决你的问题。在

你的文件是否大于2.5兆字节?在

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

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

这些细节(2.5 MB;/tmp;等)只是“合理的默认值”,可以按照下一节中的描述进行定制。在

Here是Django文件上载的指令。希望有帮助。在

我以前也遇到过类似的问题。如果您执行以下行一次,就会发生这种情况

files ={"uploadedfile": ("file1.csv", open("file1.csv", 'rb'))}

下一行需要上传不止一次。在

^{pr2}$

我猜您是从一个解释器运行上面的,并且认为您可以创建files字典一次并上传多次。它不会起作用的!此外,这与Django没有任何关系。在

所以,在每次上传之前,重新创建你的files字典,你应该很好。在

相关问题 更多 >