Sobes.tech
Middle

Hoe zou je het uploaden van bestanden naar een serverapplicatie implementeren?

sobes.tech AI

Antwoord van AI

Voor het uploaden van bestanden zou ik MultipartBody uit de Retrofit-bibliotheek gebruiken.

  1. Voorbereiden van de API-interface: Maak een interface met de annotaties @Multipart en @POST. De methode accepteert @Part voor het bestand en andere delen van het verzoek, indien aanwezig.

    interface FileApi {
        @Multipart
        @POST("/upload")
        suspend fun uploadFile(
            @Part file: MultipartBody.Part,
            @Part("description") description: RequestBody? = null
        ): Response<ResponseBody>
    }
    
  2. Aanmaken van MultipartBody.Part: Converteer File of Uri naar RequestBody, en vervolgens naar MultipartBody.Part.

    // Voor File
    val file = File("pad/naar/bestand")
    val requestFile = file.asRequestBody("multipart/form-data".toMediaTypeOrNull())
    val filePart = MultipartBody.Part.createFormData("file", file.name, requestFile)
    
    // Voor Uri
    val uri = Uri.parse("...") // Uri verkrijgen
    val inputStream = context.contentResolver.openInputStream(uri)
    val requestBody = inputStream!!.readBytes().toRequestBody("multipart/form-data".toMediaTypeOrNull(), 0, inputStream.available())
    val filePart = MultipartBody.Part.createFormData("file", "bestandsnaam", requestBody)
    

    De naam "file" in createFormData moet overeenkomen met de naam van de parameter die de server verwacht.

  3. RequestBody voor andere delen maken: Als je andere gegevens (tekst, nummers) wilt versturen, gebruik je RequestBody.

    val description = "Bestandsbeschrijving".toRequestBody("text/plain".toMediaTypeOrNull())
    
  4. Verzoek uitvoeren: Roep de methode van de Retrofit-interface aan, met de gemaakte delen.

    // Injecteer of verkrijg een instantie van FileApi
    val api: FileApi = ...
    
    // In een coroutine of andere asynchrone context
    try {
        val descriptionPart = "Mijn bestand".toRequestBody("text/plain".toMediaTypeOrNull())
        val fileToUpload = File("pad/naar/bestand")
        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) {
            // Bestand succesvol geüpload
        } else {
            // Foutafhandeling
        }
    } catch (e: Exception) {
        // Exception afhandelen
    }
    

Aanvullende aspecten:

  • Uploadprogressie: Je kunt een RequestBody implementeren met voortgangsmonitoring om een laadindicator te tonen.
  • Grote bestanden: Overweeg streaming of opsplitsing voor zeer grote bestanden.
  • Foutafhandeling: Controleer de antwoordcodes van de server en handel netwerkfouten af.
  • Permissies: Zorg dat de app toestemming heeft om bestanden te lezen (READ_EXTERNAL_STORAGE op oudere Android-versies).
  • ViewModel/Repository: Plaats de logica voor het uploaden van bestanden in een repository of ViewModel voor een betere architectuur.
  • WorkManager: Gebruik het voor achtergronduploads die moeten doorgaan, zelfs als de app gesloten is.

Voordelen van MultipartBody:

  • Standaardmethode voor het verzenden van bestanden met aanvullende gegevens.
  • Wordt ondersteund door de meeste serverframeworks.
  • Integreert goed met Retrofit.

Dit is een betrouwbare en veelgebruikte aanpak voor het uploaden van bestanden op Android.