How does one use magic to verify file type in a Django form clean method?

后端 未结 5 650
陌清茗
陌清茗 2021-01-13 14:00

I have written an email form class in Django with a FileField. I want to check the uploaded file for its type via checking its mimetype. Subsequently, I want to limit file t

5条回答
  •  执念已碎
    2021-01-13 14:23

    Stan described good variant with buffer. Unfortunately the weakness of this method is reading file to the memory. Another option is using temporary stored file:

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

    Also, you might want to check the file size:

    if form.cleaned_data['file'].size < ...:
        print(magic.from_buffer(form.cleaned_data['file'].read()))
    else:
        # store to disk (the code above)
    

    Additionally:

    Whether the name can be used to open the file a second time, while the named temporary file is still open, varies across platforms (it can be so used on Unix; it cannot on Windows NT or later).

    So you might want to handle it like so:

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

    Also, you might want to seek(0) after read():

    if hasattr(f, 'seek') and callable(f.seek):
        f.seek(0)
    

    Where uploaded data is stored

提交回复
热议问题