Django:在上传到S3之前,需要检查POST请求mime类型



所以,这是我的基本问题。我的前端有一个表单,它将一个文件发布到我的Django后端。Django会将该文件传递给AWS S3进行存储。在上传到S3之前,我需要验证文件是PDF或DOC。我想用python魔术检查一下它是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)

其中upload基本上只是封装了boto3的upload_fileobj方法。然而,根据这个Stack,我在magic.from_buffer((中使用的.read((会清空文件缓冲区,这样当我将文件传递到上传方法时,它就不存在了。

在检查文件的mime类型,然后将副本传递到上传函数之前,我曾尝试使用copy和deepcopy来复制文件,但copy和deepcopy似乎不适用于文件对象,因为在对原始文件调用.read((后,副本也是空的。

如何复制通过POST请求传递的文件,以便在将其传递到S3进行存储之前检查其mime类型?有没有其他方法可以检查它的mime类型,而不需要清空文件缓冲区?

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)
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)

最新更新