Skip to main content

Small Python module to aid developers in getting file extensions from files securely.

Project description

python-magic-file

Small Python module to aid developers in getting file extensions from files.

Purpose

The main motivation behind this package is to easily get the file extension from given file instead of trusting the arbitrary file extension in the filename, for example in a web application which accepts file uploads.

Usage

Some examples on how to use this module.

Get extension from file

from python_magic_file import MagicFile

file_path = 'path/to/file'

with open(file_path 'rb') as f:
    magic_file = MagicFile(f)
    extension = magic_file.get_extension()

Get extensions from file

from python_magic_file import MagicFile

file_path = 'path/to/file'

with open(file_path 'rb') as f:
    magic_file = MagicFile(f)
    extensions = magic_file.get_extensions()

Register unknown/non-standard mimetypes

There may be some cases where get_extension() emits a following warning:

UserWarning: File extension for mimetype "video/x-m4v" is None, consider adding an extension for this mimetype using MagicFile.

We have to register file extension using MagicFile.add_type_to_mimetypes_module for video/x-m4v so get_extension() returns the registered extension instead of None.

MagicFile.add_type_to_mimetypes_module simply just calls mimetypes.add_type.

from python_magic_file import MagicFile

# A dictionary of mimetype/extension pairs
new_types = {'video/x-m4v': '.m4v'}

for mimetype, extension in new_types.items():
    MagicFile.add_type_to_mimetypes_module(mimetype, extension)

with open('path/to/m4v-file.m4v', 'rb') as f:
    magic_file = MagicFile(f)
    extension = magic_file.get_extension() # .m4v

Get human readable name for file

from python_magic_file import MagicFile

file_path = 'path/to/file.txt'

with open(file_path 'rb') as f:
    magic_file = MagicFile(f)
    human_readable_name = magic_file.get_name() # ASCII text, with no line terminators

Usage with Flask

import os

from flask import Flask, request, abort
from python_magic_file import MagicFile

from werkzeug.utils import secure_filename
from werkzeug.security import safe_join

app = Flask(__name__)

# Allowed extensions for file uplaod
UPLOAD_ALLOWED_EXTENSIONS = ('.jpg', '.jpeg', '.png')

@app.post('/upload')
def upload_file():
    uploaded_file = request.files.get('file')

    if uploaded_file is None:
        abort(400)

    extension = MagicFile(uploaded_file.stream).get_extension()
    
    if extension not in UPLOAD_ALLOWED_EXTENSIONS:
        abort(400)

    filename, _ = os.path.splitext(secure_filename(uploaded_file.filename))

    save_path = safe_join(os.getcwd(), filename + extension)

    uploaded_file.save(save_path)

    return 'OK'

if __name__ == '__main__':
    app.run()

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

python_magic_file-0.0.7.tar.gz (4.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

python_magic_file-0.0.7-py3-none-any.whl (5.0 kB view details)

Uploaded Python 3

File details

Details for the file python_magic_file-0.0.7.tar.gz.

File metadata

  • Download URL: python_magic_file-0.0.7.tar.gz
  • Upload date:
  • Size: 4.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.10.4

File hashes

Hashes for python_magic_file-0.0.7.tar.gz
Algorithm Hash digest
SHA256 63c66fed3e5aefef446bc3ecb3241b881754259b2fa0ecc13c8d2f24cbbf5b04
MD5 f0b880dcf981ca3639ba360121d464d4
BLAKE2b-256 5b692c54fa330d3c9dad26c8e96c7cf13d458d7830c7162adceebea9eda62595

See more details on using hashes here.

File details

Details for the file python_magic_file-0.0.7-py3-none-any.whl.

File metadata

File hashes

Hashes for python_magic_file-0.0.7-py3-none-any.whl
Algorithm Hash digest
SHA256 665145d4fb90ae86fae70a7ec9a6b55a33186cc89b4cd8886328ea275babc84a
MD5 a088431d9721ad75c451340c53a397c7
BLAKE2b-256 2a0b09794283427d234adea80145c06b0ec14e2ba7f403d496e56e8d52c9e793

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page