Sobes.tech
Middle

Ako by ste implementovali nahrávanie súborov do serverovej aplikácie?

sobes.tech AI

Odpoveď od AI

Na nahrávanie súborov by som použil MultipartBody z knižnice Retrofit.

  1. Príprava API rozhrania: Vytvoríme rozhranie s anotáciami @Multipart a @POST. Metóda prijíma @Part pre súbor a ďalšie časti požiadavky, ak sú.

    interface FileApi {
        @Multipart
        @POST("/upload")
        suspend fun uploadFile(
            @Part file: MultipartBody.Part,
            @Part("description") description: RequestBody? = null
        ): Response<ResponseBody>
    }
    
  2. Vytvorenie MultipartBody.Part: Prevedieme File alebo Uri na RequestBody, a potom na MultipartBody.Part.

    // Pre File
    val file = File("cesta/k/suboru")
    val requestFile = file.asRequestBody("multipart/form-data".toMediaTypeOrNull())
    val filePart = MultipartBody.Part.createFormData("file", file.name, requestFile)
    
    // Pre Uri
    val uri = Uri.parse("...") // Získanie 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", "meno_suboru", requestBody)
    

    Názov "file" v createFormData musí zodpovedať názvu parametra, ktorý očakáva server.

  3. Vytvorenie RequestBody pre ďalšie časti: Ak je potrebné odoslať iné údaje (text, čísla), používame RequestBody.

    val description = "Popis súboru".toRequestBody("text/plain".toMediaTypeOrNull())
    
  4. Vykonanie požiadavky: Voláme metódu z rozhrania Retrofit, odovzdávajúc vytvorené časti.

    // Injektovanie alebo získanie inštancie FileApi
    val api: FileApi = ...
    
    // V coroutine alebo inom asynchrónnom kontexte
    try {
        val descriptionPart = "Môj súbor".toRequestBody("text/plain".toMediaTypeOrNull())
        val fileToUpload = File("cesta/k/suboru")
        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) {
            // Súbor úspešne nahraný
        } else {
            // Spracovanie chyby
        }
    } catch (e: Exception) {
        // Spracovanie výnimky
    }
    

Ďalšie aspekty:

  • Progres nahrávania: Môže byť implementovaný RequestBody s sledovaním pokroku, aby sa zobrazil indikátor nahrávania.
  • Veľké súbory: Pre veľmi veľké súbory zvážte streaming alebo delenie na časti.
  • Spracovanie chýb: Kontrolujte kódy odpovede servera a spracovávajte sieťové chyby.
  • Oprávnenia: Uistite sa, že aplikácia má oprávnenie na čítanie súborov (READ_EXTERNAL_STORAGE) na starších verziách Androidu.
  • ViewModel/Repository: Logiku nahrávania súboru umiestnite do repository alebo ViewModelu pre lepšiu architektúru.
  • WorkManager: Použite na pozadinské nahrávanie, ktoré má pokračovať aj pri zatvorení aplikácie.

Výhody MultipartBody:

  • Štandardný spôsob na odosielanie súborov s doplnkovými údajmi.
  • Podporované väčšinou serverových frameworkov.
  • Dobré sa integruje s Retrofitom.

Toto je spoľahlivý a široko používaný prístup na nahrávanie súborov v Android.