API referansı

HTTP protokolü

theFinder tek bir endpoint üzerinden RPC tarzında çalışır (örneğin /api/files). Arayüz bu protokolü TheFinderClient ile kullanır. Kendi istemcinizi yazacaksanız ya da API'yi başka bir dilden çağıracaksanız bu belge yeterlidir.

İstek biçimi#

KuralAyrıntı
Komutcmd parametresiyle seçilir: GET /api/files?cmd=ls&id=... ya da POST gövdesinde { "cmd": "mkdir", ... }.
YöntemlerGET, HEAD, POST. Diğerleri 405 döner.
Yalnızca okuyan komutlarinit, ls, tree, parents, info, size, search, file, thumb, download, get, trash, versions, version, stats. Bunlar GET ve POST ile çağrılabilir.
Değişiklik yapan komutlarGeri kalan her şey yalnızca POST ile çalışır; GET ile çağrılırsa BAD_REQUEST döner.
CSRF başlığıHer POST isteğinde x-thefinder başlığı bulunmalıdır (değeri önemsizdir, istemci 1 gönderir). Yoksa 403 FORBIDDEN. csrfProtection: false ile kapatılabilir.
Gövdeapplication/json, multipart/form-data ya da application/x-www-form-urlencoded. Sorgu dizesindeki parametreler de okunur; aynı ad gövdede de varsa gövdedeki kullanılır.
Listeler (ids, vids)JSON dizisi, virgülle ayrılmış metin (ids=a,b) ya da tekrarlanan sorgu parametresi (ids=a&ids=b). En fazla 10.000 öğe.
Mantıksal değerlertrue, "true", "1" ve 1 doğru sayılır.

Yanıt biçimi#

JSON dönen komutlar her zaman aynı zarfı kullanır:

{ "ok": true, "data": { ... } }
{ "ok": false, "error": { "code": "NOT_FOUND", "message": "File not found" } }

Yanıtlar Cache-Control: no-store ile gelir. file, thumb, download ve version komutları JSON yerine dosyanın kendisini döner (hata durumunda yine JSON zarfı gelir).

Komutlar#

Tablolarda Entry, VolumeInfo gibi tipler core.md › Tipler bölümünde tanımlıdır.

Gezinme#

KomutParametrelerdata
init—InitResult: { volumes, chunkSize, version, thumbnails, images }
lsid (klasör){ cwd: Entry, entries: Entry[] }
treeid (klasör){ entries: Entry[] }: yalnızca alt klasörler; sürücü destekliyorsa her birinde hasDirs
parentsid{ entries: Entry[] }: volume kökünden öğenin kendisine kadar zincir
infoids{ entries: Entry[] }
sizeids{ size, files, dirs }: klasörler özyinelemeli toplanır
searchid (aranacak klasör), q{ entries: Entry[], truncated: boolean }: alt klasörlerde de arar; büyük/küçük harf, aksan ve Türkçe ı/İ duyarsız. En fazla searchLimit sonuç.

Oluşturma ve değiştirme#

KomutParametrelerdata
mkdirid (üst klasör), name{ entry }
mkfileid (üst klasör), name, content?{ entry }
renameid, name{ entry, removed: [eskiId] }: ad değişmediyse removed boş. Yalnızca büyük/küçük harfi değişen adlar (foto.JPG → foto.jpg) büyük/küçük harf duyarsız disklerde de çalışır.
duplicateids{ added: Entry[] }: kopyalar aynı klasörde "ad (2)" biçiminde oluşur
pasteids, dst (hedef klasör), cut?, conflict?{ added: Entry[], removed: string[], skipped: string[] }

paste ayrıntıları:

Silme ve çöp kutusu#

KomutParametrelerdata
rmids, permanent?{ removed: string[], trashed: Entry[] }: çöp kutusu açıksa öğeler çöpe taşınır, permanent: true ya da trash: false ise kalıcı silinir
trashvolume?{ entries: Entry[] }: tüm volume'lerin (ya da birinin) çöpü, en yeni önce. Her öğede trash: { id, originalPath, deletedAt } vardır; path asıl konumdur.
restoreids (çöp öğesi kimlikleri){ restored: Entry[], removed: string[] }: eski yerine döner; klasör yoksa oluşturulur, ad doluysa "ad (2)" olur
purgeids ya da all: true (+ volume?){ removed: string[], all: boolean }: kalıcı siler

Çöp öğesi kimlikleri de <volume>_<base64url> biçimindedir ama .tf-trash içini gösterir. Bu kimlikler yalnızca restore ve purge ile kullanılabilir.

Yükleme#

Dosyalar parça parça (multipart/form-data) gönderilir. Parça boyutu init yanıtındaki chunkSize'dır.

AlanAçıklama
cmdupload
dstHedef klasörün kimliği
nameDosya adı
sizeDosyanın toplam boyutu (bayt)
index, totalParça sırası (0'dan başlar) ve toplam parça sayısı
offsetParçanın dosyadaki bayt konumu
chunkParçanın kendisi (dosya alanı), en fazla chunkSize bayt
sessionİlk parçada boş; sonrakilerde bir önceki yanıttaki session
relativePath?Klasör yüklemede dosyanın göreli klasörü ("fotoğraflar/2024"); dst altında oluşturulur
conflict?"overwrite": aynı adlı dosyanın üzerine yazar, eski hali sürüm geçmişine girer. Verilmezse yeni dosya "ad (2)" olur.

Yanıt: { done: false, session } ya da son parçada { done: true, session, entry }.

İçerik#

KomutParametrelerYanıt
fileid, download?, v?Dosyanın kendisi (inline ya da ek olarak). Range, ETag/304 ve HEAD desteklenir. S3'te presigned URL'e 302 yönlendirme yapılabilir. v yalnızca önbellek kırmak içindir.
thumbid, size? (varsayılan 256), v?WebP küçük resim. Boyut izin verilen en yakın değere yuvarlanır. Küçük resim yoksa ya da üretilemiyorsa orijinal dosya gönderilir.
downloadidsTek dosya doğrudan iner. Birden çok öğe ya da klasör anında oluşturulan zip olarak iner (download.zip ya da <ad>.zip).
getid{ content, bom, entry }: UTF-8 metin. En fazla maxEditSize; metin olmayan dosyada UNSUPPORTED.
putaşağıya bakın{ entry, created }

put üç biçimde çağrılır:

BiçimAlanlarSonuç
JSONid, contentMetin dosyasının üzerine yazar
multipartid, file, reason?İkili içerikle üzerine yazar (örneğin görsel editörü)
multipartdst, name, fileYeni dosya olarak kaydeder; ad doluysa boş bir ad seçilir (created: true)

Üzerine yazmadan önce dosyanın eski hali sürüm geçmişine alınır. reason sürümde saklanan kısa kelimedir (yalnızca a-z, en fazla 16 karakter, varsayılan edit).

Arşiv#

KomutParametrelerdata
archiveids (aynı klasörde olmalı), name?{ entry }: zip dosyası; ad verilmezse <ad>.zip ya da Archive.zip
extractid (.zip){ entry, skipped }: arşivle aynı adlı yeni bir klasöre açar. Geçersiz ya da izin verilmeyen uzantılı girdiler atlanır ve sayılır.

Zip-slip koruması vardır; açılan toplam boyut maxExtractSize'ı aşarsa işlem TOO_LARGE ile durur.

Sürüm geçmişi#

KomutParametrelerYanıt
versionsid{ versions: FileVersion[], entry: Entry \| null }: en yeni önce. Dosya silinmişse entry null olur ama geçmiş yine listelenir.
versionid, vid, download?Sürümün içeriği (dosya yanıtı, değişmez olduğu için 1 yıl önbelleklenir)
revertid, vid{ entry, created }: dosyayı o sürümle değiştirir; mevcut hali de sürüm olur. Dosya silinmişse yeniden oluşturur (created: true).
rmVersionsid, vids?{ removed, freed }: verilen sürümleri, vids yoksa tüm geçmişi siler

Depolama paneli#

KomutParametrelerdata
statsvolumeStorageStats: volume'ün tamamını tarar
cleanupvolume, target, …{ removed, freed }

cleanup seçenekleri:

targetEk parametrelerEtki
"cache"—Küçük resim önbelleğini siler (gerektiğinde yeniden üretilir)
"versions"mode: "all"Tüm sürümler
"versions"mode: "orphaned"Dosyası artık olmayan sürümler
"versions"mode: "older", daysdays günden eski sürümler
"versions"mode: "keep", keepHer dosyanın yalnızca son keep sürümü kalır

Toplu görsel işleme#

transform yalnızca sunucuda images ayarlıysa çalışır; aksi halde UNSUPPORTED döner.

ParametreAçıklama
idsGörseller
format?"keep" (varsayılan), "jpeg", "png", "webp", "avif", "gif"
width?, height?Bu kutuya sığdırılır; oran korunur, asla büyütülmez. En fazla 20.000.
quality?1–100, varsayılan 80
output?Biçim aynıysa: "overwrite" (varsayılan) ya da "copy" (ad-<suffix>.uzantı)
skipLarger?Varsayılan true: sonuç orijinalden küçük değilse dosyaya dokunulmaz
conflict?Çıktı adı doluysa: "rename" (varsayılan) ya da "overwrite"
suffix?Kopya ad eki, varsayılan optimized
dryRun?true: sadece kodlar ve hiçbir şey yazmadan after, width, height (ve skipped) bildirir. Gerçek çalıştırmayla aynı yetkileri ister.

Yanıt: { results: TransformResult[] }. Her dosya kendi sonucunu bildirir; bir dosyadaki hata diğerlerini durdurmaz. Biçim değiştiğinde orijinal korunur ve yanına yeni dosya yazılır. Üzerine yazılan dosyaların eski hali sürüm geçmişine girer.

Hata kodları#

KodHTTPNe zaman
BAD_REQUEST400Eksik ya da geçersiz parametre, geçersiz kimlik/yol, GET ile değişiklik komutu
UNAUTHORIZED401authorize hook'u TheFinderError("UNAUTHORIZED") fırlattı
UNKNOWN_COMMAND400Bilinmeyen cmd
NOT_FOUND404Öğe, volume ya da çöp öğesi yok
EXISTS409Aynı adla öğe var
INVALID_NAME400Geçersiz ad (\ / : * ? " < > \|, sondaki nokta, Windows'a ayrılmış adlar, 255 karakterden uzun, ayrılmış iç klasör adları)
NOT_A_DIRECTORY400Klasör beklenen yerde dosya
NOT_A_FILE400Dosya beklenen yerde klasör
FORBIDDEN403authorize false döndü, permission reddetti, CSRF başlığı yok, dosya sistemi izni yok
READ_ONLY403Volume ya da istek salt okunur
LOCKED403Volume kökü yeniden adlandırılamaz, taşınamaz, silinemez
EXTENSION_DENIED403Uzantı izin listesinde değil ya da yasak listesinde
TOO_LARGE413Yükleme, parça, düzenleme, görsel ya da arşiv sınırı aşıldı
MOVE_INTO_ITSELF400Klasör kendi içine taşınmak istendi
UNSUPPORTED400Metin olmayan dosya get ile istendi, .zip olmayan dosya açılmak istendi, sunucuda görsel işleme kapalı
INVALID_ARCHIVE400Bozuk zip
INVALID_IMAGE400Görsel çözülemedi
STORAGE502Depolama hatası (S3 yanıtı, disk dolu)
INTERNAL500Beklenmeyen hata; ayrıntı sunucu günlüğüne [thefinder] önekiyle yazılır

Dosya sistemi hataları da bu kodlara çevrilir: ENOENT → NOT_FOUND, EEXIST/ENOTEMPTY → EXISTS, EACCES/EPERM → FORBIDDEN, ENOSPC → STORAGE, ENAMETOOLONG → INVALID_NAME.

İstemci (ApiError) bunlara ek olarak sunucudan gelmeyen şu kodları üretebilir: NETWORK (bağlantı yok ya da yanıt JSON değil), ABORTED (yükleme iptal edildi), UPLOAD (yükleme tamamlanmadı), UNKNOWN.

Bu sayfa docs/api/tr/protocol.md dosyasından üretildi.