Stan 用缓冲液描述了很好的变体。不幸的是,这种方法的弱点是将文件读取到内存中。另一种选择是使用临时存储文件:
import tempfile
import magic
with tempfile.NamedTemporaryFile() as tmp:
for chunk in form.cleaned_data['file'].chunks():
tmp.write(chunk)
print(magic.from_file(tmp.name, mime=True))
此外,您可能需要检查文件大小:
if form.cleaned_data['file'].size < ...:
print(magic.from_buffer(form.cleaned_data['file'].read()))
else:
# store to disk (the code above)
另外:
在命名的临时文件仍处于打开状态时,是否可以使用该名称再次打开文件,因平台而异(在 Unix 上可以这样使用;在 Windows NT 或更高版本上不能)。
所以你可能想像这样处理它:
import os
tmp = tempfile.NamedTemporaryFile(delete=False)
try:
for chunk in form.cleaned_data['file'].chunks():
tmp.write(chunk)
print(magic.from_file(tmp.name, mime=True))
finally:
os.unlink(tmp.name)
tmp.close()
seek(0)
此外,您可能想要read()
:
if hasattr(f, 'seek') and callable(f.seek):
f.seek(0)
上传数据的存储位置