我有一个脚本向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对象始终为空。
为什么?
答案 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文件上传的版本。希望它有所帮助。