Skip to main content

Easy Python upload manager for images, files and media. Python fork of robsonvleite/uploader (PHP).

Project description

Uploader (Python)

Port em Python do pacote PHP coffeecode/uploader de Robson V. Leite. Mantem a mesma API e o mesmo comportamento: classes pequenas para enviar imagens, arquivos e midias recebidos por um formulario, com gestao de diretorios por ano/mes e validacao por mime-type/extensao.

Python port of the PHP package coffeecode/uploader by Robson V. Leite. It mirrors the original API and behavior: small classes to upload images, files and media from a form, with year/month directory management and mime-type/extension validation.

Destaques

  • Upload simples de imagens, arquivos e midias
  • Gestao de diretorios com esquema de datas (YYYY/MM)
  • Validacao por mime-type e extensao
  • Redimensionamento e qualidade de imagem (substitui ext-gd por Pillow)
  • API equivalente a do pacote PHP original

Instalacao

pip install coffeecode-uploader

Requer Python >= 3.9 e Pillow >= 10.

Uso

A entrada e um dicionario com as chaves name, type e tmp_name (mesmo formato de $_FILES no PHP). Em frameworks como Flask ou FastAPI basta montar esse dicionario a partir do arquivo recebido.

Image

from coffeecode_uploader import Image, UploaderException

image = Image("uploads", "images")            # com pastas ano/mes
# image = Image("uploads", "images", False)   # SEM pastas de ano e mes

try:
    file = {
        "name": request.files["image"].filename,
        "type": request.files["image"].mimetype,
        "tmp_name": "/tmp/upload.jpg",
    }
    path = image.upload(file, "Foto Perfil")        # width=2000, quality auto
    # path = image.upload(file, "Foto", 1280, {"jpg": 80, "png": 6})
except UploaderException as e:
    print(f"(!) {e}")

File

from coffeecode_uploader import File

f = File("uploads", "files")
path = f.upload(
    {"name": "report.pdf", "type": "application/pdf", "tmp_name": "/tmp/r.pdf"},
    "Relatorio Mensal",
)

Media

from coffeecode_uploader import Media

m = Media("uploads", "medias")
path = m.upload(
    {"name": "track.mp3", "type": "audio/mpeg", "tmp_name": "/tmp/t.mp3"},
    "Minha Musica",
)

Send (tipos customizados)

from coffeecode_uploader import Send

postscript = Send(
    "uploads",
    "postscript",
    allow_types=["application/postscript"],
    extensions=["ai"],
)
path = postscript.upload(file_dict, "Logo")

API

Construtor (todas as classes)

Image(upload_dir, file_type_dir, month_year_path=True)
File(upload_dir, file_type_dir, month_year_path=True)
Media(upload_dir, file_type_dir, month_year_path=True)
Send(upload_dir, file_type_dir, allow_types, extensions, month_year_path=True)

upload(file_dict, name, ...)

Retorna a string com o caminho final relativo. Lanca UploaderException quando o tipo MIME ou a extensao nao estao na lista permitida.

  • Image.upload(image, name, width=2000, quality=None)quality aceita {"jpg": 0..95, "png": 0..9}. Padrao: {"jpg": 75, "png": 5}. GIFs sao copiados sem reprocessamento (igual ao PHP).
  • File.upload(file, name)
  • Media.upload(media, name)
  • Send.upload(file, name)

Helpers

  • Cls.is_allowed() (alias Cls.isAllowed()) — lista de mime-types permitidos.
  • Cls.is_extension() (alias Cls.isExtension()) — lista de extensoes permitidas.
  • instance.multiple(input_name, files) — converte um envio multiplo no formato $_FILES em uma lista de dicionarios individuais.

Comportamento de nome

O slug e gerado a partir de name com:

  1. lowercase
  2. normalizacao Unicode (NFKD) + remocao de acentos
  3. caracteres nao alfanumericos viram -
  4. extensao do arquivo original e anexada
  5. se o arquivo final ja existir, -{timestamp_unix} e adicionado

Equivalencia com a versao PHP

PHP Python
CoffeeCode\Uploader\Image coffeecode_uploader.Image
CoffeeCode\Uploader\File coffeecode_uploader.File
CoffeeCode\Uploader\Media coffeecode_uploader.Media
CoffeeCode\Uploader\Send coffeecode_uploader.Send
Exception UploaderException
$_FILES['x'] dict com name, type, tmp_name
move_uploaded_file() shutil.move (com fallback copyfile)
ext-gd Pillow
monthYearPath month_year_path

Creditos

  • API e comportamento original: Robson V. Leite — coffeecode/uploader (MIT)
  • Port Python: Kaue Leal

Licenca

MIT.

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

coffeecode_uploader-1.0.0.tar.gz (9.8 kB view details)

Uploaded Source

Built Distribution

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

coffeecode_uploader-1.0.0-py3-none-any.whl (9.0 kB view details)

Uploaded Python 3

File details

Details for the file coffeecode_uploader-1.0.0.tar.gz.

File metadata

  • Download URL: coffeecode_uploader-1.0.0.tar.gz
  • Upload date:
  • Size: 9.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for coffeecode_uploader-1.0.0.tar.gz
Algorithm Hash digest
SHA256 3fac96694e0bdc47443cbe8b24281b48945acce8e4841660d1f9f6b820b535d6
MD5 23a4f0043167a8c61b353a3d2ba9f3fa
BLAKE2b-256 36a19af64e2f092f08595eae5e4415164c59c789cf3588df30482eda88da7031

See more details on using hashes here.

Provenance

The following attestation bundles were made for coffeecode_uploader-1.0.0.tar.gz:

Publisher: release.yml on kauelima21/coffeecode-uploader

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file coffeecode_uploader-1.0.0-py3-none-any.whl.

File metadata

File hashes

Hashes for coffeecode_uploader-1.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 ea98c18219c011a748cd06001044ae9a0415e2f1b165856e67ad9f0c92fdb9ec
MD5 b12e1d578f02ae34b21678e880919928
BLAKE2b-256 ed4e63825ef7c9df4afdce683275da7baa16cf54bb49496659ac5798f37dd45d

See more details on using hashes here.

Provenance

The following attestation bundles were made for coffeecode_uploader-1.0.0-py3-none-any.whl:

Publisher: release.yml on kauelima21/coffeecode-uploader

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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