【问题标题】:django check if the uploaded file is a zip filedjango 检查上传的文件是否为 zip 文件
【发布时间】:2017-03-30 14:08:45
【问题描述】:

我在 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 模块还是有什么方法可以在不写入磁盘的情况下做到这一点?

注意:由于各种不相关的原因,我没有使用带有 FileField 和相应表单的 Django 模型。

【问题讨论】:

  • 检查文件扩展名怎么样?
  • 不幸的是,我的应用程序无法依赖...

标签: python django zip zipfile


【解决方案1】:

是的,你应该使用zipfile 模块。

zipfile.is_zipfile(filename)

如果文件名是基于其幻数的有效 ZIP 文件,则返回 True,否则返回 False。文件名也可以是文件或类似文件的对象。 (在 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)

【讨论】:

  • 是的,问题是必须存储该文件才能与zipfile 一起使用。我想没有其他真正好的方法可以做到这一点。
【解决方案2】:

保存 pbject 的文件名

Name = request.FILES['filename'].name

然后检查是否是zip文件

If Name.endswith('.zip'):
     print(True)

【讨论】:

  • 它与我之前提到的必须存储文件的问题相同。我想没有真正好的和健壮的方法来检查内存文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-20
  • 2012-08-17
  • 2019-08-12
  • 2011-10-03
  • 1970-01-01
相关资源
最近更新 更多