我在Django中有一个POST方法的处理程序,它接收一个上传的文件。我想要做的是在继续之前验证该文件是否是有效的zip文件。
所以,我有:
@login_required(login_url="login/")
def upload(request):
if request.method == 'POST' and request.FILES['upload_file']:
uploaded_file = request.FILES['upload_file']
print type(uploaded_file)
return render(request, 'upload.html', {'context': RequestContext(request)})
此时此uploaded_file
的类型为<class 'django.core.files.uploadedfile.InMemoryUploadedFile'>
。我的问题是,验证这是一个有效的存档的最佳方法是什么?我是否需要将其保存到磁盘然后使用zipfile
模块,或者有没有办法在不写入磁盘的情况下执行此操作?
注意:由于各种不相关的原因,我没有将Django模型与FileField和相应的Form一起使用。
答案 0 :(得分:6)
是的,您应该使用zipfile
模块。
zipfile.is_zipfile(filename)
如果filename是基于其幻数的有效ZIP文件,则返回True,否则返回False。 filename也可以是文件或类文件对象。 (在3.1版中更改:支持文件和类文件对象。)
另一种选择:(不太可能,但你的选择)
How to detect type of compression used on the file? (if no file extension is specified)
您可以在说明中找到标题格式:
Zip(.zip)格式描述,以0x50,0x4b,0x03,0x04开头(除非为空 - 然后最后两个是0x05,0x06或0x06,0x06)
答案 1 :(得分:0)
保存pbject的文件名
Name = request.FILES['filename'].name
然后检查是否是zip文件
If Name.endswith('.zip'):
print(True)