Sobes.tech
Middle

Jak byste implementovali nahrávání souborů do serverové aplikace?

sobes.tech AI

Odpověď od AI

Pro nahrávání souborů bych použil MultipartBody z knihovny Retrofit.

  1. Příprava API rozhraní: Vytvoříme rozhraní s anotacemi @Multipart a @POST. Metoda přijímá @Part pro soubor a další části požadavku, pokud jsou.

    interface FileApi {
        @Multipart
        @POST("/upload")
        suspend fun uploadFile(
            @Part file: MultipartBody.Part,
            @Part("description") description: RequestBody? = null
        ): Response<ResponseBody>
    }
    
  2. Vytvoření MultipartBody.Part: Převádíme File nebo Uri na RequestBody, a poté na MultipartBody.Part.

    // Pro File
    val file = File("cesta/k/souboru")
    val requestFile = file.asRequestBody("multipart/form-data".toMediaTypeOrNull())
    val filePart = MultipartBody.Part.createFormData("file", file.name, requestFile)
    
    // Pro Uri
    val uri = Uri.parse("...") // Získání 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", "název_souboru", requestBody)
    

    Název "file" v createFormData musí odpovídat jménu parametru, které očekává server.

  3. Vytvoření RequestBody pro jiné části: Pokud je potřeba poslat jiné údaje (text, čísla), použijeme RequestBody.

    val description = "Popis souboru".toRequestBody("text/plain".toMediaTypeOrNull())
    
  4. Provedení požadavku: Voláme metodu z rozhraní Retrofit, předávající vytvořené části.

    // Injektujeme nebo získáváme instanci FileApi
    val api: FileApi = ...
    
    // V coroutine nebo jiném asynchronním kontextu
    try {
        val descriptionPart = "Můj soubor".toRequestBody("text/plain".toMediaTypeOrNull())
        val fileToUpload = File("cesta/k/souboru")
        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) {
            // Soubor úspěšně nahrán
        } else {
            // Zpracování chyby
        }
    } catch (e: Exception) {
        // Zpracování výjimky
    }
    

Další aspekty:

  • Progres nahrávání: Lze implementovat RequestBody s sledováním pokroku, aby se zobrazil indikátor nahrávání.
  • Velké soubory: Pro velmi velké soubory zvážit streaming nebo rozdělení na části.
  • Zpracování chyb: Kontrolovat kódy odpovědi serveru a zpracovávat síťové chyby.
  • Oprávnění: Ujistit se, že aplikace má oprávnění ke čtení souborů (READ_EXTERNAL_STORAGE) na starších verzích Androidu.
  • ViewModel/Repository: Logiku nahrávání souboru umístit do repository nebo ViewModelu pro lepší architekturu.
  • WorkManager: Použít pro pozadí nahrávání, které má pokračovat i při zavření aplikace.

Výhody MultipartBody:

  • Standardní způsob pro odesílání souborů s doplňkovými daty.
  • Podporováno většinou serverových frameworků.
  • Dobře se integruje s Retrofitem.

Toto je spolehlivý a široce používaný přístup k nahrávání souborů v Androidu.