Sobes.tech
Middle

Kaip įgyvendintumėte failų įkėlimą į serverio programą?

sobes.tech AI

Atsakymas iš AI

Failų įkėlimo atveju naudotume MultipartBody iš Retrofit bibliotekos.

  1. API sąsajos paruošimas: Sukuriame sąsają su anotacija @Multipart ir @POST. Metodas priima @Part failui ir kitus užklausos dalis, jei jų yra.

    interface FileApi {
        @Multipart
        @POST("/upload")
        suspend fun uploadFile(
            @Part file: MultipartBody.Part,
            @Part("description") description: RequestBody? = null
        ): Response<ResponseBody>
    }
    
  2. MultipartBody.Part sukūrimas: Konvertuojame File arba Uri į RequestBody, tada į MultipartBody.Part.

    // Failo atveju
    val file = File("kelias/iki/failo")
    val requestFile = file.asRequestBody("multipart/form-data".toMediaTypeOrNull())
    val filePart = MultipartBody.Part.createFormData("file", file.name, requestFile)
    
    // Uri atveju
    val uri = Uri.parse("...") // gauname 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", "failo_vardas", requestBody)
    

    "file" pavadinimas createFormData turi atitikti serverio lauką.

  3. Kitiems duomenims sukurti RequestBody: Jei reikia siųsti kitus duomenis (tekstas, skaičiai), naudokite RequestBody.

    val description = "Failo aprašymas".toRequestBody("text/plain".toMediaTypeOrNull())
    
  4. Užklausos vykdymas: Iškvieskite Retrofit sąsajos metodą, perduodami sukurtas dalis.

    // Injektuojame arba gauname FileApi instanciją
    val api: FileApi = ...
    
    // Korutinoje ar kitame asinchroniniame kontekste
    try {
        val descriptionPart = "Mano failas".toRequestBody("text/plain".toMediaTypeOrNull())
        val fileToUpload = File("kelias/iki/failo")
        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) {
            // Failas sėkmingai įkeltas
        } else {
            // Klaidos apdorojimas
        }
    } catch (e: Exception) {
        // Išimties apdorojimas
    }
    

Papildomi aspektai:

  • Įkėlimo progresas: galima įgyvendinti RequestBody su progresu stebėjimu, kad rodytų įkėlimo indikatorius.
  • Dideli failai: labai dideliems failams svarstykite srautų perdavimą arba dalijimąsi į dalis.
  • Klaidų apdorojimas: tikrinkite serverio atsakymo kodus ir tvarkykite tinklo klaidas.
  • Leidimai: įsitikinkite, kad programai yra leidimas skaityti failus (READ_EXTERNAL_STORAGE senesnėse Android versijose).
  • ViewModel/Repository: failo įkėlimo logiką įdėkite į repository ar ViewModel geresnei architektūrai.
  • WorkManager: naudokite foniniam įkėlimui, kuris turi tęstis net ir uždarius programą.

MultipartBody privalumai:

  • Standartinis būdas siųsti failus su papildomais duomenimis.
  • Palaikomas daugumos serverio karkasų.
  • Gerai integruojasi su Retrofit.

Tai patikimas ir plačiai naudojamas būdas įkelti failus Android platformoje.