【问题标题】:Django: Need to check POST request mime type before uploading it to S3Django:需要在上传到 S3 之前检查 POST 请求 mime 类型
【发布时间】:2020-10-23 22:00:46
【问题描述】:

所以,这是我的基本问题。我的前端有一个表单,可以将文件发布到我的 Django 后端。然后,Django 将该文件传递给 AWS S3 进行存储。在上传到 S3 之前,我需要验证文件是 PDF 或 DOC。我想用python-magic 来检查它的mime 类型,就像这样,

form = UploadFileForm(request.POST, request.FILES)

if form.is_valid():
     mime_type = magic.from_buffer(request.FILES['file'].read(), mime=True)
     
     if mime_type in ALLOWED_MIMETYPES:
          upload(request.FILES['file'], file_name)

上传基本上只是包装boto3's upload_fileobj 方法。但是,根据this Stack,我在 magic.from_buffer() 中使用的 .read() 会清空文件缓冲区,以便在我将文件传递到上传时方法,它不再存在。

我尝试使用copy and deepcopy 复制文件,然后检查它的 MIME 类型,然后将副本传递给上传功能,但复制和深度复制似乎不适用于文件对象,因为副本之后也是空的在原件上调用 .read()

如何复制通过 POST 请求传递的文件,以便在将其传递到 S3 进行存储之前检查其 mime 类型?是否有另一种方法可以检查它的 MIME 类型而不涉及清空文件缓冲区?

【问题讨论】:

    标签: python django amazon-web-services amazon-s3 boto3


    【解决方案1】:
    form = UploadFileForm(request.POST, request.FILES)
    
    if form.is_valid():
        mime_type = magic.from_buffer(request.FILES['file'].read(), mime=True)
        request.FILES['file'].seek(0)
    
        if mime_type in ALLOWED_MIMETYPES:
            upload(request.FILES['file'], file_name)
    

    【讨论】:

      【解决方案2】:
      form = UploadFileForm(request.POST, request.FILES)
      
      if form.is_valid():
          file = request.FILES['file']
          sio = BytesIO(file)
      
          mag = magic.Magic(mime=True)
          sio.seek(0)
          sio.content_type = mag.from_buffer(sio.read())
      
          if sio.content_type not in ALLOWED_MIMETYPES:
              sio.seek(0)
              upload(sio, file_name)
      

      【讨论】:

        猜你喜欢
        • 2022-11-10
        • 1970-01-01
        • 2014-02-20
        • 1970-01-01
        • 1970-01-01
        • 2011-06-09
        • 2021-08-09
        相关资源
        最近更新 更多