Sobes.tech
Middle

Ինչպե՞ս կիրականացնեիք ֆայլերի բեռնումը սերվերային հավելվածում։

sobes.tech AI

Պատասխան AI-ից

Ֆայլեր բեռնելու համար ես օգտագործում MultipartBody Retrofit գրադարանի։

  1. API ինտերֆեյսի պատրաստում: Ստեղծում ենք ինտերֆեյս @Multipart և @POST նշաններով։ Մեթոդը ընդունում է @Part ֆայլի և այլ մասերի համար, եթե կան։

    interface FileApi {
        @Multipart
        @POST("/upload")
        suspend fun uploadFile(
            @Part file: MultipartBody.Part,
            @Part("description") description: RequestBody? = null
        ): Response<ResponseBody>
    }
    
  2. MultipartBody.Part ստեղծում: Փոխարկում ենք File կամ UriRequestBody-ի և հետո MultipartBody.Part-ի։

    // Ֆայլի համար
    val file = File("ուղի/ֆայլի")
    val requestFile = file.asRequestBody("multipart/form-data".toMediaTypeOrNull())
    val filePart = MultipartBody.Part.createFormData("file", file.name, requestFile)
    
    // Uri-ի համար
    val uri = Uri.parse("...") // Uri ստանում ենք
    val inputStream = context.contentResolver.openInputStream(uri)
    val requestBody = inputStream!!.readBytes().toRequestBody("multipart/form-data".toMediaTypeOrNull(), 0, inputStream.available())
    val filePart = MultipartBody.Part.createFormData("file", "անուն_ֆայլի", requestBody)
    

    "file" անունը createFormData-ում պետք է համընկնի սերվերի սպասած պարամետրի անվան հետ։

  3. RequestBody ստեղծում այլ մասերի համար: Եթե անհրաժեշտ է ուղարկել այլ տվյալներ (տեքստ, թվեր), օգտագործում ենք RequestBody։

    val description = "Ֆայլի նկարագրություն".toRequestBody("text/plain".toMediaTypeOrNull())
    
  4. Հարցման իրականացում: Կոչ ենք անում Retrofit ինտերֆեյսի մեթոդը, փոխանցելով ստեղծված մասերը։

    // Injekt կամ ստանում ենք FileApi-ի ինստանս
    val api: FileApi = ...
    
    // Կորուտին կամ այլ ասինխրոն կոնտեքստում
    try {
        val descriptionPart = "Իմ ֆայլը".toRequestBody("text/plain".toMediaTypeOrNull())
        val fileToUpload = File("ուղի/ֆայլի")
        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) {
            // Ֆայլը հաջողությամբ բեռնվել է
        } else {
            // Հետագա սխալի մշակումը
        }
    } catch (e: Exception) {
        // Исключения обработки
    }
    

Լրացուցիչ կողմեր:

  • Բեռնման առաջընթաց: Կարող է իրականացնել RequestBody հետևելով առաջընթացին, ցուցադրելու բեռնման ցուցիչ։
  • Ավելի մեծ ֆայլեր: Շատ մեծ ֆայլերի համար դիտարկել streaming կամ բաժանելը մասերի։
  • Սխալների մշակումը: Ստուգել սերվերի պատասխանների կոդերը և մշակել ցանցային սխալները։
  • Թույլտվություններ: Համոզվեք, որ հավելվածը ունի ֆայլերի ընթերցման թույլտվություն (READ_EXTERNAL_STORAGE) հին Android տարբերակներում։
  • ViewModel/Repository: Ֆայլի բեռնման տրամաբանությունը տեղադրել ռեպոզիտորիայում կամ ViewModel-ում ավելի լավ ճարտարապետության համար։
  • WorkManager: Օգտագործել ֆոնային բեռնման համար, որը պետք է շարունակվի նույնիսկ եթե հավելվածը փակվի։

MultipartBody-ի առավելությունները:

  • Ստանդարտ միջոց ֆայլեր ուղարկելու համար լրացուցիչ տվյալներով։
  • Աջակցվում է մեծ մասամբ սերվերային ֆրեյմվորկների կողմից։
  • Լավ ինտեգրվում է Retrofit-ի հետ։

Սա հուսալի և լայնորեն օգտագործվող մոտեցում է ֆայլեր բեռնելու համար Android-ում։