Sobes.tech
Middle

Cum ați implementa încărcarea fișierelor într-o aplicație server?

sobes.tech AI

Răspuns de la AI

Pentru încărcarea fișierelor, aș folosi MultipartBody din biblioteca Retrofit.

  1. Pregătirea interfeței API: Creăm o interfață cu adnotările @Multipart și @POST. Metoda acceptă @Part pentru fișier și alte părți ale cererii, dacă există.

    interface FileApi {
        @Multipart
        @POST("/upload")
        suspend fun uploadFile(
            @Part file: MultipartBody.Part,
            @Part("description") description: RequestBody? = null
        ): Response<ResponseBody>
    }
    
  2. Crearea MultipartBody.Part: Convertim File sau Uri în RequestBody, apoi în MultipartBody.Part.

    // Pentru File
    val file = File("cale/catre/fisier")
    val requestFile = file.asRequestBody("multipart/form-data".toMediaTypeOrNull())
    val filePart = MultipartBody.Part.createFormData("file", file.name, requestFile)
    
    // Pentru Uri
    val uri = Uri.parse("...") // Obțineți 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", "nume_fisier", requestBody)
    

    Numele "file" în createFormData trebuie să corespundă cu numele parametrului așteptat de server.

  3. Crearea RequestBody pentru alte părți: Dacă trebuie să trimiteți alte date (text, numere), folosiți RequestBody.

    val description = "Descriere fișier".toRequestBody("text/plain".toMediaTypeOrNull())
    
  4. Executarea cererii: Apelați metoda din interfața Retrofit, trecând părțile create.

    // Injectați sau obțineți o instanță de FileApi
    val api: FileApi = ...
    
    // Într-o coroutine sau alt context asincron
    try {
        val descriptionPart = "Fișierul meu".toRequestBody("text/plain".toMediaTypeOrNull())
        val fileToUpload = File("cale/catre/fisier")
        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) {
            // Fișier încărcat cu succes
        } else {
            // Tratarea erorii
        }
    } catch (e: Exception) {
        // Tratarea excepției
    }
    

Aspecte suplimentare:

  • Progresul încărcării: Se poate implementa RequestBody cu monitorizare a progresului pentru a afișa un indicator de încărcare.
  • Fișiere mari: Pentru fișiere foarte mari, se poate considera streaming sau împărțirea în părți.
  • Gestionarea erorilor: Verificați codurile de răspuns ale serverului și tratați erorile de rețea.
  • Permisiuni: Asigurați-vă că aplicația are permisiunea de a citi fișierele (READ_EXTERNAL_STORAGE pe versiunile mai vechi de Android).
  • ViewModel/Repository: Plasați logica de încărcare a fișierelor într-un repository sau ViewModel pentru o arhitectură mai bună.
  • WorkManager: Folosiți-l pentru încărcări în fundal care trebuie să continue chiar dacă aplicația este închisă.

Avantajele MultipartBody:

  • Metodă standard pentru trimiterea fișierelor cu date suplimentare.
  • Suportat de majoritatea framework-urilor server.
  • Se integrează bine cu Retrofit.

Aceasta este o abordare fiabilă și larg utilizată pentru încărcarea fișierelor în Android.