Sobes.tech
Middle

Hogyan valósítanád meg a fájlok feltöltését egy szerveralkalmazásba?

sobes.tech MI

Válasz az MI-től

Fájlok feltöltéséhez a Retrofit könyvtárból a MultipartBody-t használnám.

  1. API interfész előkészítése: Létrehozunk egy interfészt @Multipart és @POST annotációkkal. A metódus @Part-okat fogad a fájlhoz és a kérés többi részéhez, ha vannak.

    interface FileApi {
        @Multipart
        @POST("/upload")
        suspend fun uploadFile(
            @Part file: MultipartBody.Part,
            @Part("description") description: RequestBody? = null
        ): Response<ResponseBody>
    }
    
  2. MultipartBody.Part létrehozása: Átalakítjuk a File-t vagy Uri-t RequestBody-vá, majd MultipartBody.Part-t készítünk.

    // Fájlhoz
    val file = File("útvonal/a/fájlhoz")
    val requestFile = file.asRequestBody("multipart/form-data".toMediaTypeOrNull())
    val filePart = MultipartBody.Part.createFormData("file", file.name, requestFile)
    
    // Uri-hez
    val uri = Uri.parse("...") // Uri beszerzése
    val inputStream = context.contentResolver.openInputStream(uri)
    val requestBody = inputStream!!.readBytes().toRequestBody("multipart/form-data".toMediaTypeOrNull(), 0, inputStream.available())
    val filePart = MultipartBody.Part.createFormData("file", "fájl_név", requestBody)
    

    A "file" név a createFormData-ban egyezzen meg a szerver által várt paraméter névvel.

  3. RequestBody létrehozása más részekhez: Ha más adatokat (szöveg, számok) kell küldeni, akkor RequestBody-t használunk.

    val description = "Fájl leírása".toRequestBody("text/plain".toMediaTypeOrNull())
    
  4. Kérés végrehajtása: Meghívjuk a Retrofit interfész metódusát, átadva a létrehozott részeket.

    // FileApi példány injektálása vagy beszerzése
    val api: FileApi = ...
    
    // Coroutine vagy más aszinkron környezetben
    try {
        val descriptionPart = "A fájlom".toRequestBody("text/plain".toMediaTypeOrNull())
        val fileToUpload = File("útvonal/a/fájlhoz")
        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) {
            // Sikeres feltöltés
        } else {
            // Hiba kezelése
        }
    } catch (e: Exception) {
        // Kivétel kezelése
    }
    

További szempontok:

  • Feltöltési folyamat: Megvalósítható RequestBody-val, ami nyomon követi a folyamatot, és mutat egy betöltési indikátort.
  • Nagy fájlok: Nagyon nagy fájlok esetén streaming vagy darabolás javasolt.
  • Hiba kezelés: Ellenőrizze a szerver válasz kódját, és kezelje a hálózati hibákat.
  • Engedélyek: Győződjön meg arról, hogy az alkalmazás rendelkezik fájl olvasási engedéllyel (READ_EXTERNAL_STORAGE régebbi Android verziókon).
  • ViewModel/Repository: A fájl feltöltési logikát helyezze el a repository-ban vagy ViewModel-ben a jobb architektúráért.
  • WorkManager: Használja háttérben történő feltöltéshez, amely akkor is folytatódik, ha az alkalmazás bezáródik.

MultipartBody előnyei:

  • Szabványos módszer fájlok és kiegészítő adatok küldésére.
  • Támogatott a legtöbb szerveroldali keretrendszer által.
  • Jól integrálódik a Retrofittel.

Ez egy megbízható és széles körben használt megközelítés fájlok feltöltésére Androidon.