Sobes.tech
Middle

Server ilovaga fayllarni yuklashni qanday amalga oshirasiz?

sobes.tech AI

AIdan javob

Fayllarni yuklash uchun Retrofit kutubxonasidan MultipartBody dan foydalanardim.

  1. API interfeysini tayyorlash: @Multipart va @POST anotatsiyalari bilan interfeys yaratamiz. Metod fayl uchun @Part va so‘rovning boshqa qismlari uchun qabul qiladi, agar mavjud bo‘lsa.

    interface FileApi {
        @Multipart
        @POST("/upload")
        suspend fun uploadFile(
            @Part file: MultipartBody.Part,
            @Part("description") description: RequestBody? = null
        ): Response<ResponseBody>
    }
    
  2. MultipartBody.Part yaratish: File yoki Uri ni RequestBody ga, so‘ngra MultipartBody.Part ga o‘tkazamiz.

    // File uchun
    val file = File("yo‘l/ga/fayl")
    val requestFile = file.asRequestBody("multipart/form-data".toMediaTypeOrNull())
    val filePart = MultipartBody.Part.createFormData("file", file.name, requestFile)
    
    // Uri uchun
    val uri = Uri.parse("...") // Uri ni olamiz
    val inputStream = context.contentResolver.openInputStream(uri)
    val requestBody = inputStream!!.readBytes().toRequestBody("multipart/form-data".toMediaTypeOrNull(), 0, inputStream.available())
    val filePart = MultipartBody.Part.createFormData("file", "fayl_nomi", requestBody)
    

    createFormData ichidagi "file" nomi server kutayotgan parametr nomi bilan mos kelishi kerak.

  3. Boshqa qismlar uchun RequestBody yaratish: Agar boshqa ma’lumotlarni (matn, raqamlar) yuborish kerak bo‘lsa, RequestBody dan foydalanamiz.

    val description = "Fayl tavsifi".toRequestBody("text/plain".toMediaTypeOrNull())
    
  4. So‘rovni bajarish: Retrofit interfeys metodini chaqiramiz, yaratilgan qismlarni uzatamiz.

    // FileApi ni in’ektsiya qilish yoki olish
    val api: FileApi = ...
    
    // Coroutine yoki boshqa asinxron kontekstda
    try {
        val descriptionPart = "Mening faylim".toRequestBody("text/plain".toMediaTypeOrNull())
        val fileToUpload = File("yo‘l/ga/fayl")
        val requestFile = fileToUpload.asRequestBody("multipart/form-data".toMediaTypeOrNull())
        val filePart = MultipartBody.Part.createFormData("file", fileToUpload.name, requestFile)
    
        val response = api.uploadFile(filePart, descriptionPart)
    
        if (response.isSuccessful) {
            // Fayl muvaffaqiyatli yuklandi
        } else {
            // Xatolikni boshqarish
        }
    } catch (e: Exception) {
        // Istisnoni boshqarish
    }
    

Qo‘shimcha jihatlar:

  • Yuklash progressi: Progressni kuzatadigan RequestBody ni amalga oshirish mumkin, yuklash indikatorini ko‘rsatish uchun.
  • Katta fayllar: Juda katta fayllar uchun streaming yoki bo‘laklarga bo‘lishni ko‘rib chiqish.
  • Xatoliklarni boshqarish: Server javob kodlarini tekshirish va tarmoq xatoliklarini boshqarish.
  • Ruxsatlar: Ilovaning fayllarni o‘qish ruxsatiga ega ekanligiga ishonch hosil qilish (READ_EXTERNAL_STORAGE eski Android versiyalarida).
  • ViewModel/Repository: Fayl yuklash mantiqini repository yoki ViewModelda joylashtirish, yaxshiroq arxitektura uchun.
  • WorkManager: fon yuklamalar uchun foydalanish, ular ilova yopilgan bo‘lsa ham davom etishi uchun.

MultipartBody ning afzalliklari:

  • Qo‘shimcha ma’lumotlar bilan fayllarni yuborish uchun standart usul.
  • Ko‘pgina server frameworklari tomonidan qo‘llab-quvvatlanadi.
  • Retrofit bilan yaxshi integratsiya qilinadi.

Bu Androidda fayl yuklash uchun ishonchli va keng qo‘llaniladigan yondashuvdir.