The files & folders domains
api.files and api.folders work together — folders organize files, files live in folders. Upload from your device or import from a URL.
api.files reference
| Function | Returns | Description |
|---|---|---|
api.files.get(id) |
table or nil | Get file metadata + URLs |
api.files.list(filter?) |
{ items, total } |
List files with filters |
api.files.upload(data) |
table | Upload from $_FILES (multipart form) |
api.files.import(url, folderId) |
table | Download a file from a URL |
api.files.rename(id, name) |
table | Rename a file |
api.files.delete(id) |
boolean | Delete a file |
api.folders reference
| Function | Returns | Description |
|---|---|---|
api.folders.get(id) |
table or nil | Get folder info |
api.folders.list(parentId?) |
table[] | List folders (no pagination) |
api.folders.create(name, parentId?) |
table | Create a folder |
api.folders.rename(id, name) |
table | Rename a folder |
api.folders.delete(id) |
boolean | Delete a folder |
Upload a file
app:post("/upload", function(ctx)
local file = req.files.photo
if not file then
ctx:flash("error", "No file selected")
return ctx:redirect("/upload")
end
local uploaded = api.files.upload({ file = file })
ctx:flash("success", "Uploaded: " .. uploaded.name)
return ctx:redirect("/files")
end)
Import from URL
app:post("/import", function(ctx)
local url = req.post.url
local folder_id = tonumber(req.post.folder) or 0
local file = api.files.import(url, folder_id)
return ctx:redirect("/files")
end)
File browser
app:get("/files", function(ctx)
local folder_id = tonumber(req.query.folder) or 0
local files = api.files.list({
folderid = folder_id,
order = "id_desc",
limit = 50
})
local folders = api.folders.list(folder_id)
return ctx:render("files", {
files = files.items,
folders = folders,
current_folder = folder_id,
total = files.total
})
end)
Creating folder structure
-- Organize uploads
local docs = api.folders.create("Documents")
local images = api.folders.create("Images")
api.folders.create("Reports", docs.id) -- sub-folder
api.folders.create("Invoices", docs.id) -- sub-folder
File list filter
api.files.list({
folderid = 5, -- filter by folder
search = "photo", -- search file names
order = "id_desc", -- sort order
page = 1,
limit = 50
})
File URLs
Each file object includes multiple URLs:
local file = api.files.get(200)
print(file.url) -- https://yoursite.wapka.site/files/photo.jpg
print(file.cdn_url) -- https://cdn.wapka.org/files/200/photo.jpg
print(file.thumb_url) -- https://cdn.wapka.org/thumbs/200/photo.jpg
Use cdn_url for better performance — it's served from a global CDN.
Next: api.pages & api.codes — read site pages and code blocks.