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-gdpor 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)—qualityaceita{"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()(aliasCls.isAllowed()) — lista de mime-types permitidos.Cls.is_extension()(aliasCls.isExtension()) — lista de extensoes permitidas.instance.multiple(input_name, files)— converte um envio multiplo no formato$_FILESem uma lista de dicionarios individuais.
Comportamento de nome
O slug e gerado a partir de name com:
- lowercase
- normalizacao Unicode (NFKD) + remocao de acentos
- caracteres nao alfanumericos viram
- - extensao do arquivo original e anexada
- 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
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3fac96694e0bdc47443cbe8b24281b48945acce8e4841660d1f9f6b820b535d6
|
|
| MD5 |
23a4f0043167a8c61b353a3d2ba9f3fa
|
|
| BLAKE2b-256 |
36a19af64e2f092f08595eae5e4415164c59c789cf3588df30482eda88da7031
|
Provenance
The following attestation bundles were made for coffeecode_uploader-1.0.0.tar.gz:
Publisher:
release.yml on kauelima21/coffeecode-uploader
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
coffeecode_uploader-1.0.0.tar.gz -
Subject digest:
3fac96694e0bdc47443cbe8b24281b48945acce8e4841660d1f9f6b820b535d6 - Sigstore transparency entry: 1414514030
- Sigstore integration time:
-
Permalink:
kauelima21/coffeecode-uploader@5a899b4eb128361734313dbadaab874f812a6e7d -
Branch / Tag:
refs/tags/v1.0.0 - Owner: https://github.com/kauelima21
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@5a899b4eb128361734313dbadaab874f812a6e7d -
Trigger Event:
push
-
Statement type:
File details
Details for the file coffeecode_uploader-1.0.0-py3-none-any.whl.
File metadata
- Download URL: coffeecode_uploader-1.0.0-py3-none-any.whl
- Upload date:
- Size: 9.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ea98c18219c011a748cd06001044ae9a0415e2f1b165856e67ad9f0c92fdb9ec
|
|
| MD5 |
b12e1d578f02ae34b21678e880919928
|
|
| BLAKE2b-256 |
ed4e63825ef7c9df4afdce683275da7baa16cf54bb49496659ac5798f37dd45d
|
Provenance
The following attestation bundles were made for coffeecode_uploader-1.0.0-py3-none-any.whl:
Publisher:
release.yml on kauelima21/coffeecode-uploader
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
coffeecode_uploader-1.0.0-py3-none-any.whl -
Subject digest:
ea98c18219c011a748cd06001044ae9a0415e2f1b165856e67ad9f0c92fdb9ec - Sigstore transparency entry: 1414514087
- Sigstore integration time:
-
Permalink:
kauelima21/coffeecode-uploader@5a899b4eb128361734313dbadaab874f812a6e7d -
Branch / Tag:
refs/tags/v1.0.0 - Owner: https://github.com/kauelima21
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@5a899b4eb128361734313dbadaab874f812a6e7d -
Trigger Event:
push
-
Statement type: