Files API
API reference pro endpointy správy souborů.
Přehled
Files API poskytuje endpointy pro nahrávání, stahování a sdílení souborů uložených v Cloudflare R2.
Oprávnění: Většina endpointů vyžaduje autentizaci. Veřejný přístup k souborům používá tokeny.
Endpointy
GET /files
Seznam souborů s paginací a filtrováním.
Oprávnění: Bearer token (vyžaduje autentizaci)
Query parametry:
page(volitelné): Číslo stránky (výchozí: 1)pageSize(volitelné): Počet položek na stránku (výchozí: 50, max: 100)entity_type(volitelné): Filtrování podle typu entity (např. 'project')entity_id(volitelné): Filtrování podle ID entity
Autorizace:
- Sailor: Vidí pouze své vlastní soubory
- Producer, Admin: Vidí všechny soubory
Response:
{
"success": true,
"data": {
"files": [
{
"id": 1,
"r2_key": "projects/123/files/1704067200000-abc123.pdf",
"filename": "document.pdf",
"mime_type": "application/pdf",
"size": 1024000,
"file_type": "FILE",
"entity_type": "project",
"entity_id": 123,
"uploaded_by_user_id": 1,
"public_token": null,
"is_public": 0,
"created_at": 1704067200
}
],
"pagination": {
"total": 10,
"page": 1,
"pageSize": 50,
"totalPages": 1
}
}
}
POST /files/upload
Nahrání souboru do R2 úložiště.
Oprávnění: Bearer token (vyžaduje autentizaci)
Request: Multipart form data
file(File): Soubor k nahráníentity_type(volitelné, string): Typ entity (např. 'project', 'item')entity_id(volitelné, number): ID entityfile_type(volitelné, string): Kategorie typu souboru ('FILE', 'PHOTO', 'OTHER')
Struktura R2 klíče:
- Pro projekty:
projects/{project_id}/files/{timestamp}-{random}.{ext}neboprojects/{project_id}/photos/{timestamp}-{random}.{ext} - Pro ostatní:
{file_type}/{timestamp}-{random}.{ext}
Validace souboru:
- Maximální velikost: 10MB
- Povolené MIME typy:
- Obrázky:
image/jpeg,image/png,image/gif,image/webp - Dokumenty:
application/pdf,text/plain,text/csv - Office:
application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document
- Obrázky:
- Povolené přípony:
jpg,jpeg,png,gif,webp,pdf,txt,csv,xls,xlsx,doc,docx
Response:
{
"success": true,
"data": {
"id": 1,
"r2_key": "other/1704067200000-abc123.pdf",
"filename": "document.pdf",
"mime_type": "application/pdf",
"size": 1024000,
"file_type": "OTHER",
"entity_type": null,
"entity_id": null,
"uploaded_by_user_id": 1,
"public_token": null,
"is_public": 0,
"created_at": 1704067200
}
}
Error Response (soubor příliš velký):
{
"success": false,
"error": "VALIDATION_ERROR",
"message": "File too large. Maximum size is 10MB"
}
Error Response (neplatný MIME typ):
{
"success": false,
"error": "VALIDATION_ERROR",
"message": "File type application/x-executable is not allowed"
}
Rate Limit: 10 požadavků za minutu na uživatele
GET /files/:id/download
Stažení souboru (autentizovaný přístup).
Oprávnění: Bearer token (vyžaduje autentizaci)
Response: Stream souboru s příslušnými hlavičkami
Headers:
Content-Type: MIME typ souboruContent-Disposition:attachment; filename="filename.ext"
Error Response:
{
"success": false,
"error": "NOT_FOUND",
"message": "File not found"
}
PUT /files/:id/public
Vygenerování veřejného sdílecího tokenu pro soubor.
Oprávnění: Bearer token (vyžaduje autentizaci, vlastník nebo Admin)
Request: Žádný
Response:
{
"success": true,
"data": {
"file_id": 1,
"public_token": "base64url-43-character-token",
"public_url": "/files/public/base64url-43-character-token",
"message": "File is now publicly accessible"
}
}
Error Response (není vlastník):
{
"success": false,
"error": "FORBIDDEN",
"message": "You do not have permission to share this file"
}
Rate Limit: 2000 požadavků za minutu na uživatele
DELETE /files/:id/public
Zrušení veřejného sdílení souboru.
Oprávnění: Bearer token (vyžaduje autentizaci, vlastník nebo Admin)
Request: Žádný
Response:
{
"success": true,
"data": {
"file_id": 1,
"message": "Public sharing revoked"
}
}
Rate Limit: 2000 požadavků za minutu na uživatele
GET /files/public/:token
Stažení souboru pomocí veřejného tokenu (autentizace není vyžadována).
Oprávnění: Žádné (veřejný endpoint)
Response: Stream souboru s příslušnými hlavičkami
Headers:
Content-Type: MIME typ souboruContent-Disposition:attachment; filename="filename.ext"
Error Response:
{
"success": false,
"error": "NOT_FOUND",
"message": "File not found or not publicly accessible"
}
Bezpečnost souborů
Sanitizace názvu souboru
Názvy souborů jsou sanitizovány, aby se zabránilo:
- Path traversal útokům (
../,..\\) - Null bytům
- Vedoucím/koncovým tečkám a mezerám
- Řídicím znakům
- Délka omezena na 255 znaků
Generování R2 klíče
R2 klíče jsou generovány bezpečně:
- Formát:
{file_type}/{timestamp}-{random}.{extension} - Žádný uživatelský vstup při generování klíče
- Zabraňuje kolizím a path traversal
Bezpečnost veřejného tokenu
- Délka: 43 znaků (32 bytů base64url-encoded)
- Jedinečnost: Kontrolována proti databázi před přiřazením
- Generování: Kryptograficky bezpečný náhodný (
crypto.getRandomValues) - Zrušení: Může být zrušeno vlastníkem nebo Adminem
Typy souborů
Běžné kategorie typů souborů:
FILE- Dokumenty a soubory (PDF, Word, Excel, atd.)PHOTO- Obrázkové soubory (fotky)OTHER- Ostatní typy souborů
Struktura složek
Soubory jsou organizovány ve struktuře složek v R2:
Pro projekty:
projects/{project_id}/files/- Dokumenty projektuprojects/{project_id}/photos/- Fotky projektu
Pro ostatní:
{file_type}/- Obecné soubory podle typu
Tato struktura umožňuje snadné filtrování a správu souborů podle projektu.
Kódy chyb
VALIDATION_ERROR- Neplatný vstup (velikost souboru, MIME typ, přípona)NOT_FOUND- Soubor nenalezenFORBIDDEN- Nedostatečná oprávněníINTERNAL_ERROR- Chyba serveru
Související témata
- Bezpečnostní průvodce - Bezpečnostní postupy pro nahrávání souborů