Multipart Upload — bu matn maydonlari va ikkilik fayllarni o'z ichiga olgan holda, bir so'rovda bir nechta turli xil ma'lumot qismlarini uzatish imkonini beruvchi HTTP mexanizmidir. Har bir qism noyob chegara qatori bilan ajratilgan va o'zining Content-Type sarlavhasiga ega. MDN Web Docs, 2025 ma'lumotlariga ko'ra, multipart/form-data HTML formalari orqali fayllarni yuklash uchun standart format bo'lib, veb va mobil ilovalarda tasvirlar, hujjatlar va boshqa fayllarni serverga jo'natish uchun keng qo'llaniladi.
Asosiy ma'lumotlar
Multipart Upload — bu HTTP protokoli orqali ma'lumotlarni uzatish usuli bo'lib, unda so'rov tanasi bir nechta mantiqiy ajratilgan qismlardan iborat. Har bir qism har xil turdagi ma'lumotlarni o'z ichiga olishi mumkin: forma matn maydoni, ikkilik fayl, JSON obyekti yoki tasvir. Barcha qismlar bitta POST so'roviga joylanadi, bu esa N ta alohida HTTP chaqiruvini yuborish zaruratini yo'q qiladi. Multipart Upload veb formalari va fayl yuklash API-larining ajralmas qismidir.
Multipart formati RFC 2046 spetsifikatsiyasida elektron pochta xabarlari uchun MIME standartining bir qismi sifatida belgilangan, keyin esa RFC 1867 da HTTP uchun moslashtirilgan. Bugungi kunda veb-ishlanmada deyarli faqat multipart/form-data ishlatiladi — fayllarni o'z ichiga olgan formalar uchun mo'ljallangan multipart kichik turlaridan biri. Boshqa kichik turlar — multipart/mixed (ixtiyoriy qo'shimchalar uchun) va multipart/byteranges (fayllarni qisman yuklash uchun) — ancha kam qo'llaniladi.
Multipartning oddiy application/x-www-form-urlencoded dan asosiy farqi shundaki, ikkinchisi barcha ma'lumotlarni URI-ga mos qatorga kodlaydi va ikkilik fayllarni qo'llab-quvvatlamaydi. Multipart/form-data esa aksincha, har bir faylni asl ikkilik shaklida kodlamasdan uzatadi, bu esa samaraliroq va aniqlikni yo'qotmaydi. So'rov hajmi multipartda qism sarlavhalari va chegaralar uchun qo'shimcha xarajatlar tufayli fayl o'lchamlari yig'indisidan atigi 5-15% kattaroqdir.
Multipart Upload fayl yuklash talab qilinadigan hamma joyda qo'llaniladi: ijtimoiy tarmoqlardagi avatarlar va profil rasmlari, messenjerlardagi qo'shimchalar, CRM tizimlaridagi hujjatlar, onlayn do'konlardagi mahsulot tasvirlari. Mobil ilovalarda Multipart Upload media fayllarni serverga jo'natish uchun ishlatiladi — qurilma kamerasidan olingan fotosuratlar, ovoz yozuvlari, video parchalar. Cloudflare Research ma'lumotlariga ko'ra, vebdagi barcha POST so'rovlarining taxminan 15% multipart/form-data dan foydalanadi.
Multipart Upload va Chunked Transfer turli mexanizmlardir. Multipart so'rovni mazmunli qismlarga (maydonlar va fayllar) ajratadi, Chunked Transfer esa ma'lumot oqimini umumiy hajmni bilmasdan uzatish uchun bo'laklarga ajratadi. Multipart Chunked Transfer ichida uzatilishi mumkin: server to'liq hajmini bilmagan holda multipart javobini qismlarga bo'lib yuboradi. Bu mexanizmlar bir-biriga zid emas va turli darajalarda turli vazifalarni hal qiladi.
Brauzer enctype="multipart/form-data" atributiga ega formani yuborganda, u so'rov tanasini multipart formatida tuzadi. Formaning har bir maydoni alohida blokga aylanadi, boshqalardan chegara qatori (boundary) bilan ajratiladi. Chegara avtomatik yaratiladi va ma'lumotlar ichida uchramasligi kafolatlangan noyob belgilar ketma-ketligidir. Mijoz bu chegarani Content-Type sarlavhasiga qo'shadi: multipart/form-data; boundary=----WebKitFormBoundaryX7K.
Har bir blok --boundary bilan boshlanadi va maydon nomi (name) va fayllar uchun asl fayl nomi (filename) bilan Content-Disposition sarlavhalarini o'z ichiga oladi. Bo'sh qatordan keyin to'g'ridan-to'g'ri maydon ma'lumotlari yoki fayl tarkibi ikkilik shaklda keladi. So'rov --boundary-- qatori bilan tugaydi. Server qabul qilingan oqimni tahlil qiladi: avval chegarani topadi, keyin har bir qismning sarlavhalarini chiqaradi, ma'lumot turini aniqlaydi va ularni forma ishlovchisiga yoki API boshqaruvchisiga uzatadi.
IETF RFC 7578 ga ko'ra, multipart/form-data har bir qism uchun charset belgilashni talab qilmaydi, chunki matn maydonlari UTF-8 deb hisoblanadi, ikkilik qismlar esa fayllarni asl kodlashda o'z ichiga oladi. Bitta qismning hajmi protokol bilan cheklanmagan — cheklovlar server darajasida sozlanadi: masalan, Nginx da client_max_body_size, Spring Boot da spring.servlet.multipart.max-file-size orqali.
Boundary — uzatiladigan ma'lumotlarda uchramasligi kerak bo'lgan noyob qatordir. Odatda prefiks bilan boshlanadi (masalan, ----WebKitFormBoundary yoki ----Boundary) va tasodifiy belgilarni o'z ichiga oladi. Brauzerlar va HTTP mijozlari boundary ni avtomatik yaratadi. RFC 2046 ga ko'ra boundary uzunligi 70 belgidan oshmasligi kerak. Har bir qism --boundary\r\n qatori bilan ajratiladi, so'rovning oxiri esa --boundary--\r\n qatori bilan belgilanadi.
Multipart so'rov MIME va HTTP standartlari bilan belgilangan qat'iy tuzilishga ega. So'rov sarlavhasi boundary parametri bilan Content-Type: multipart/form-data ni o'rnatadi. So'rov tanasi ketma-ket qismlardan iborat bo'lib, ularning har biri o'z sarlavhalari va tanasini o'z ichiga oladi. Qism sarlavhalari Content-Disposition (majburiy) va Content-Type (ixtiyoriy — fayllar uchun) ni o'z ichiga oladi. Qism sarlavhalari va uning ma'lumotlari o'rtasida bo'sh qator bo'lishi majburiydir.
| Element | Misol | Majburiylik |
|---|---|---|
| Content-Type | multipart/form-data; boundary=---Bnd123 | Ha |
| Qism ajratuvchi | ---Bnd123 | Ha (har bir qismdan oldin) |
| Content-Disposition | form-data; name="avatar"; filename="photo.jpg" | Ha |
| Qismning Content-Type i | image/jpeg | Fayllar uchun |
| Qism tanasi | [tasvirning ikkilik ma'lumotlari] | Ha |
| Yakuniy chegara | ---Bnd123-- | Ha (so'rov oxiri) |
Keling, matn maydoni va tasvir faylini yuboradigan haqiqiy multipart so'rov misolini ko'rib chiqaylik. Mijoz noyob boundary bilan Content-Type sarlavhasini yaratadi. So'rov tanasi ketma-ket formaning barcha maydonlarini o'z ichiga oladi. Server qabul qilganda bu qismlarni tahlil qiladi va dasturchiga har bir maydonga alohida obyekt sifatida kirish imkonini beradi. Bu yondashuv fayllari bo'lgan murakkab formalarni bitta HTTP chaqiruvida qayta ishlash imkonini beradi.
import okhttp3.*
import java.io.File
fun uploadFile() {
val client = OkHttpClient()
val imageFile = File("/path/to/photo.jpg")
val requestBody = MultipartBody.Builder()
.setType(MediaType.parse("multipart/form-data"))
.addFormDataPart("username", "john_doe")
.addFormDataPart(
"avatar", "photo.jpg",
RequestBody.create(
MediaType.parse("image/jpeg"), imageFile
)
)
.build()
val request = Request.Builder()
.url("https://api.example.com/upload")
.post(requestBody)
.build()
client.newCall(request).execute().use { response ->
println("Yuklandi: ${response.isSuccessful}")
}
}
Server tomonida multipart so'rov framework tomonidan yoki qo'lda tahlil qilinadi. Spring Boot da @RequestParam("avatar") MultipartFile file annotatsiyasi kifoya qiladi va framework avtomatik ravishda faylni multipart so'rovidan chiqaradi. Ktor da Kotlin da receiveMultipart(), Express.js da multer middleware ishlatiladi. Server forma maydonlarining har biriga va yuklangan fayllarning har biriga mustaqil kirish imkoniyatiga ega bo'ladi, faylni diskda yoki bulutli saqlashda saqlaydi va mijozga URL yoki identifikatorni qaytaradi.
Multipart Upload muqobil ma'lumot uzatish usullari bilan solishtirganda bir nechta asosiy afzalliklarni taqdim etadi. Ko'p o'rniga bitta so'rov — forma maydonlari va fayllarning barchasi bitta HTTP chaqiruvida uzatiladi, bu esa tarmoq va server yukini kamaytiradi. N faylni yuklash uchun N ta ulanish ochish shart emas — hamma narsa bitta POST ga joylanadi. Bu, ayniqsa, har bir HTTP ulanishi kechikish va batareya sarfini anglatadigan mobil ilovalar uchun muhimdir.
Kodlamasiz ikkilik uzatish — application/x-www-form-urlencoded dan farqli o'laroq, unda ikkilik ma'lumotlar base64 da kodlanadi (hajm 33% ga oshadi), multipart/form-data fayllarni asl ikkilik shaklda uzatadi. Bu hajm va tezlik jihatidan samaraliroq. 10 MB dan katta fayllar uchun farq muhim bo'ladi: multipart so'rov bir xil fayl bilan URL-encoded so'rovdan 30% kichikroq bo'ladi.
Ixtiyoriy tuzilma — multipart har xil turdagi maydonlarni istalgan tartibda birlashtirish imkonini beradi. Forma bir vaqtning o'zida matn maydonlari, bir nechta fayllar, JSON ma'lumotlari va yashirin maydonlarni o'z ichiga olishi mumkin. Har bir qism o'zining Content-Type ga ega, bu matn va ikkilik ma'lumotlarni aralashtirish imkonini beradi. Taqqoslash uchun: base64 kodlash hajmga 33% qo'shadi, multipart esa xizmat sarlavhalari uchun atigi 5-15% qo'shadi.
HTTP Archive, 2025 tadqiqotiga ko'ra, multipart/form-data vebdagi fayl yuklash holatlarining 94% ida ishlatiladi. Muqobillar — JSON da base64 (4%) va WebSocket orqali to'g'ridan-to'g'ri uzatish (2%). JSON base64 bilan boshqa ma'lumotlar ham JSON da bo'lgan API lar uchun qulay, ammo katta fayllar uchun samarasiz. WebSocket real vaqt rejimi uchun mos, ammo barcha HTTP infratuzilmalari tomonidan qo'llab-quvvatlanmaydi. Multipart soddaligi va samaradorligi tufayli fayl yuklash uchun standart bo'lib qolmoqda.
Mobil ilovalarda Multipart Upload foydalanuvchi qurilmalaridan media tarkibini jo'natish uchun ishlatiladi: galereyadan fotosuratlar, kameradan olingan tasvirlar, ovoz yozuvlari, hujjat fayllari. Android da standart usul — MultipartBody.Builder bilan OkHttp, bu multipart so'rovlarini oson shakllantirish imkonini beradi. Retrofit ham @Multipart va @Part annotatsiyalari orqali multipartni qo'llab-quvvatlaydi. Dasturchi har bir qism uchun ma'lumot turini belgilaydi, HTTP mijoz avtomatik ravishda to'g'ri sarlavhalarni yaratadi.
iOS da xuddi shu vazifalar URLSession bilan maxsus HTTPBodyStream yoki Alamofire bilan multipartFormData orqali hal qilinadi. Alamofire multipart so'rovlarini jo'natish uchun qulay upload(multipartFormData:) metodini taqdim etadi. Ikkala platformada ham yuklanayotgan fayllarning hajmini hisobga olish muhim — katta fayllar (10-20 MB dan ortiq) uchun ilova minimallashtirilganda yopilmasligi uchun fon yuklashdan foydalanish tavsiya etiladi. Android da buning uchun DownloadManager yoki WorkManager, iOS da — background konfiguratsiyasi bilan URLSession ishlatiladi.
Mobil ilovalarda fayllarni yuklashda tarmoq holatini hisobga olish kerak. Connectivity Manager Android da Wi-Fi yoki mobil ma'lumot mavjudligini aniqlash va yuklash uchun optimal momentni tanlashga yordam beradi. Video kabi katta fayllar uchun yuklashni Wi-Fi ga ulangunga qoldirish tavsiya etiladi, foydalanuvchining mobil trafigini isrof qilmaslik uchun. Android da WorkManager NetworkType.UNMETERED orqali bunday cheklovlarni sozlash imkonini beradi.
Faylni Multipart Upload orqali jo'natishdan oldin, mobil ilovalar ko'pincha tasvirni siqadi va hajmini o'zgartiradi. JPEG siqish 85% sifat bilan fayl hajmini ekranda ko'rish uchun sezilarli sifat yo'qotmasdan 3-5 marta kamaytiradi. Tasvirni uzun tomoni bo'yicha 1920px gacha o'zgartirish hajmini yanada kamaytiradi. Android da buning uchun Bitmap.compress(), iOS da — UIImageJPEGRepresentation 0.85 siqish parametri bilan ishlatiladi. Bunday optimallashtirish yuklashni tezlashtiradi va mobil trafikni tejaydi.
Multipart Upload da eng keng tarqalgan xato — serverda so'rov hajmi chegarasidan oshib ketish. Odatiy bo'lib, Nginx so'rov tanasining hajmini 1 MB (client_max_body_size), Tomcat esa 2 MB (maxSwallowSize) bilan cheklaydi. Agar dasturchi bu chegaralarni oshirmasa, server 413 Request Entity Too Large xatosini qaytaradi. Yechim — serverda maksimal yuklash hajmini aniq sozlash va mijozda fayl ruxsat etilgan hajmdan katta bo'lsa ogohlantirish ko'rsatish.
Ikkinchi muammo — tanani oqimlash paytida multipart so'rovlarini noto'g'ri qayta ishlash. Ba'zi serverlar tahlildan oldin butun multipart so'rovini xotiraga yuklashga urinadi, bu esa katta fayllar uchun OutOfMemoryError ga olib keladi. Zamonaviy serverlar (Nginx, Spring Boot, Ktor) har bir qism kelishi bilan qayta ishlanadigan oqimli multipart tahlilini qo'llab-quvvatlaydi. Dasturchi server oqimli qayta ishlash uchun sozlanganligiga ishonch hosil qilishi kerak.
Uchinchi toifa muammolar — katta fayllarni yuklashda vaqt tugashi. HTTP mijozlarining readTimeout va connectTimeout sozlamalari bor, ular 50-100 MB dan katta faylni uzoq muddatli yuklashda ishga tushishi mumkin. Yechim — yuklash endpointlari uchun vaqt tugashlarini oshirish yoki multipart ichida chunked transfer encoding dan foydalanish. Mobil qurilmalarda yuklashning uzilishini qayta ishlash va ulanish yo'qolganida qayta tiklashni (resume) amalga oshirish ham muhimdir.
Fayllarni yuklash multipart orqali veb ilovaning eng zaif endpointlaridan biridir. Tajovuzkor nomini image.jpg ga o'zgartirib, bajariladigan skriptni yuklashi mumkin. Server yuklanayotgan faylning MIME turini kengaytmaga qarab emas, balki tarkibiga qarab (magic bytes) tekshirishi, ruxsat etilgan turlarni cheklashi va fayllarni antivirus bilan skanerlashi kerak. Yuklangan fayllarni veb serverning document-root idan tashqarida saqlash va ularni alohida kirish huquqlarini tekshirish bilan boshqaruvchi orqali taqdim etish tavsiya etiladi.
Tez-tez beriladigan savollar
multipart/form-data forma maydonlarining har birini o'z sarlavhalari bilan alohida blok sifatida uzatadi va kodlamasdan ikkilik fayllarni qo'llab-quvvatlaydi. application/x-www-form-urlencoded barcha ma'lumotlarni URI-ga mos qatorga kodlaydi (kalit=qiymat&kalit2=qiymat2) va fayllarni to'g'ridan-to'g'ri qo'llab-quvvatlamaydi — ularni base64 da kodlash kerak.
HTTP protokoli multipart so'rovining hajmini cheklamaydi, ammo amalda cheklovlar server tomonidan o'rnatiladi. Nginx odatiy bo'lib 1 MB, Apache — 2 MB, Spring Boot — 1 MB bilan cheklaydi. Katta fayllarni yuklash uchun client_max_body_size (Nginx) yoki spring.servlet.multipart.max-file-size (Spring Boot) ni kerakli qiymatga — masalan, 100 MB ga sozlang.
Ha, multipart/form-data bir so'rovda bir nechta fayllarni qo'llab-quvvatlaydi. Har bir fayl o'zining Content-Disposition va Content-Type bilan alohida qism sifatida uzatiladi. HTML formalar input type="file" uchun multiple atributidan foydalanadi. OkHttp da buning uchun har bir fayl uchun addFormDataPart chaqiriladi, Alamofire da — har bir fayl uchun append.
Boundary — murakkab so'rov qismlarini ajratuvchi va serverga bir qismning qayerda tugab, ikkinchisining qayerda boshlanishini aniqlash imkonini beruvchi noyob qatordir. Mijoz tomonidan yaratiladi va Content-Type sarlavhasida ko'rsatiladi. Boundary bo'lmasa, server ko'p komponentli so'rovni alohida maydonlar va fayllarga ajrata olmaydi.
Fayl kengaytmasiga yoki so'rovdagi Content-Type ga ishonmang — tajovuzkor ularni soxtalashtirishi mumkin. MIME turini magic bytes (faylning birinchi baytlari) orqali tekshiring: Java da Apache Tika kutubxonalari, C/C++ da libmagic, Linux da buyruq file, yoki frameworklarning ichki vositalari — Java da Files.probeContentType(), Python da mimetypes.
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.