Format multipart/form-data, butuh field apikey dan file. Limit ukuran 20MB per file.
curl -X POST https://cdn.xiaocia.my.id/upload \
-F "apikey=X14OC14" \
-F "file=@/path/ke/file.jpg"
{
"status": true,
"creator": "Xiaocia",
"result": {
"url": "https://cdn.xiaocia.my.id/file/xc-13.jpg",
"name": "file.jpg",
"size": 149086,
"mimetype": "image/jpeg"
}
}
| Status HTTP | Keterangan |
|---|---|
| 400 | Field file tidak ditemukan |
| 403 | API key salah atau kosong |
| 405 | Method bukan POST |
| 500 | Internal server error |
Catatan: GIF diam otomatis di-convert menjadi .mp4. Ekstensi URL hasil bisa berbeda dari file asli.
Stream file publik. Tidak memerlukan API key. Format ID sequential (xc-1, xc-2, dst).
GET https://cdn.xiaocia.my.id/file/xc-13.jpg
404 kalau file gak ketemu: {"status":false,"message":"File tidak ditemukan atau link sudah kedaluwarsa."}
Hapus file dari CDN secara permanen. Butuh apikey admin di header — beda dari apikey upload. File yang dihapus langsung 404.
curl -X DELETE https://cdn.xiaocia.my.id/file/xc-13.jpg \
-H "apikey: ADMIN_KEY"
{"status": true, "message": "File udah dihapus."}
| Status HTTP | Keterangan |
|---|---|
| 401 | Apikey admin salah atau sesi tidak valid |
| 404 | File tidak ditemukan atau sudah dihapus |
| 500 | Internal server error |
const axios = require('axios');
const FormData = require('form-data');
async function uploadToXiaocia(fileUrl, fileName) {
const fileRes = await axios.get(fileUrl, { responseType: 'arraybuffer' });
const form = new FormData();
form.append('apikey', 'X14OC14');
form.append('file', Buffer.from(fileRes.data), fileName);
const res = await axios.post('https://cdn.xiaocia.my.id/upload', form, {
headers: form.getHeaders(),
});
return res.data.result.url;
}
// const url = await uploadToXiaocia(attachment.url, attachment.name);
// message.reply(`Link: ${url}`);
async function uploadFromTelegramFile(bot, fileId, fileName) {
const fileLink = await bot.getFileLink(fileId);
return uploadToXiaocia(fileLink, fileName);
}
import aiohttp
async def upload_to_xiaocia(file_bytes: bytes, filename: str, api_key: str) -> str:
async with aiohttp.ClientSession() as session:
form = aiohttp.FormData()
form.add_field('apikey', api_key)
form.add_field('file', file_bytes, filename=filename)
async with session.post('https://cdn.xiaocia.my.id/upload', data=form) as resp:
data = await resp.json()
if not data['status']:
raise Exception(data['message'])
return data['result']['url']
Pake result.url buat dikirim ke user, bukan result.name.