Sobes.tech
Middle

Kako biste implementirali učitavanje fajlova u serversku aplikaciju?

sobes.tech АИ

Одговор од АИ

Za učitavanje fajlova koristio bih MultipartBody iz Retrofit biblioteke.

  1. Priprema API interfejsa: Kreiramo interfejs sa anotacijama @Multipart i @POST. Metoda prihvata @Part za fajl i ostale delove zahteva, ako ih ima.

    interface FileApi {
        @Multipart
        @POST("/upload")
        suspend fun uploadFile(
            @Part file: MultipartBody.Part,
            @Part("description") description: RequestBody? = null
        ): Response<ResponseBody>
    }
    
  2. Kreiranje MultipartBody.Part: Pretvaramo File ili Uri u RequestBody, a zatim u MultipartBody.Part.

    // Za File
    val file = File("putanja/do/fajla")
    val requestFile = file.asRequestBody("multipart/form-data".toMediaTypeOrNull())
    val filePart = MultipartBody.Part.createFormData("file", file.name, requestFile)
    
    // Za Uri
    val uri = Uri.parse("...") // Dobijanje 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", "ime_fajla", requestBody)
    

    Ime "file" u createFormData mora da bude isto kao i ime parametra koje očekuje server.

  3. Kreiranje RequestBody za ostale delove: Ako je potrebno poslati druge podatke (tekst, brojevi), koristimo RequestBody.

    val description = "Opis fajla".toRequestBody("text/plain".toMediaTypeOrNull())
    
  4. Izvršavanje zahteva: Pozivamo metodu iz Retrofit interfejsa, prosleđujući kreirane delove.

    // Injektovanje ili dobijanje instance FileApi
    val api: FileApi = ...
    
    // U korutini ili drugom asinhronom kontekstu
    try {
        val descriptionPart = "Moj fajl".toRequestBody("text/plain".toMediaTypeOrNull())
        val fileToUpload = File("putanja/do/fajla")
        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) {
            // Fajl uspešno upload-ovan
        } else {
            // Obrada greške
        }
    } catch (e: Exception) {
        // Obrada izuzetka
    }
    

Dodatni aspekti:

  • Progres učitavanja: Može se implementirati RequestBody sa praćenjem napretka, za prikaz indikatora učitavanja.
  • Veliki fajlovi: Za veoma velike fajlove razmotriti streaming ili deljenje na delove.
  • Obrada grešaka: Proveravati kodove odgovora servera i obrađivati mrežne greške.
  • Dozvole: Uveriti se da aplikacija ima dozvolu za čitanje fajlova (READ_EXTERNAL_STORAGE) na starijim verzijama Androida.
  • ViewModel/Repository: Logiku za učitavanje fajla staviti u repository ili ViewModel za bolju arhitekturu.
  • WorkManager: Koristiti za pozadinsko učitavanje koje treba da se nastavi čak i ako je aplikacija zatvorena.

Prednosti MultipartBody:

  • Standardan način za slanje fajlova sa dodatnim podacima.
  • Podržava ga većina server-side framework-a.
  • Dobro se integriše sa Retrofit-om.

Ovo je pouzdan i široko korišćen pristup za učitavanje fajlova u Android-u.