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.
-
Voorbereiden van de API-interface: Maak een interface met de annotaties
@Multiparten@POST. De methode accepteert@Partvoor 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> } -
Aanmaken van MultipartBody.Part: Converteer
FileofUrinaarRequestBody, en vervolgens naarMultipartBody.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"increateFormDatamoet overeenkomen met de naam van de parameter die de server verwacht. -
RequestBody voor andere delen maken: Als je andere gegevens (tekst, nummers) wilt versturen, gebruik je
RequestBody.val description = "Bestandsbeschrijving".toRequestBody("text/plain".toMediaTypeOrNull()) -
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
RequestBodyimplementeren 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_STORAGEop 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.