为什么在连续上载相同文件时收到空的InMemoryUploadedFile对象

时间:2014-08-29 04:19:34

标签: python django

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

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

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

payload = request.FILES
file = payload['uploadedfile']
print "File size:", file.size

输出:

File size: 1758

但是当我第二次在 新POST请求 中收到文件时(由于上传脚本在无限循环中运行),该文件为空。

File size: 0

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

我也试过上传多个不同的文件。每当第一次在同一文件上传n次后,InMemoryUploadedFile对象始终为空。

为什么?

3 个答案:

答案 0 :(得分:2)

之前我遇到过类似的问题。如果您执行以下一行

,就会发生这种情况
files ={"uploadedfile": ("file1.csv", open("file1.csv", 'rb'))}

以及涉及多次上传的下一行。

requests.post(url, files=files)

我猜你是从翻译人员那里运行上面的,并且认为你可以创建一次files字典并上传很多次。它不会起作用!而且,这与Django没有任何关系。

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

答案 1 :(得分:1)

只需file.seek(0)。这将解决您的问题。

答案 2 :(得分:0)

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

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

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

这些细节 - 2.5兆字节;的/ tmp;等 - 只是“合理的默认值”,可以按照下一节的描述进行自定义。

Here是Django文件上传的版本。希望它有所帮助。