Wie würden Sie das Hochladen von Dateien in eine Serveranwendung implementieren?
sobes.tech KI
Antwort von AI
Um Dateien hochzuladen, würde ich MultipartBody aus der Retrofit-Bibliothek verwenden.
-
API-Schnittstelle vorbereiten: Erstellen Sie eine Schnittstelle mit den Anmerkungen
@Multipartund@POST. Die Methode akzeptiert@Partfür die Datei und andere Teile der Anfrage, falls vorhanden.interface FileApi { @Multipart @POST("/upload") suspend fun uploadFile( @Part file: MultipartBody.Part, @Part("description") description: RequestBody? = null ): Response<ResponseBody> } -
MultipartBody.Part erstellen: Konvertieren Sie
FileoderUriinRequestBodyund dann inMultipartBody.Part.// Für File val file = File("pfad/zur/datei") val requestFile = file.asRequestBody("multipart/form-data".toMediaTypeOrNull()) val filePart = MultipartBody.Part.createFormData("file", file.name, requestFile) // Für Uri val uri = Uri.parse("...") // Uri erhalten val inputStream = context.contentResolver.openInputStream(uri) val requestBody = inputStream!!.readBytes().toRequestBody("multipart/form-data".toMediaTypeOrNull(), 0, inputStream.available()) val filePart = MultipartBody.Part.createFormData("file", "datei_name", requestBody)Der Name
"file"increateFormDatamuss mit dem Parametername auf Serverseite übereinstimmen. -
RequestBody für andere Teile erstellen: Wenn andere Daten (Text, Zahlen) gesendet werden sollen, verwenden Sie
RequestBody.val description = "Dateibeschreibung".toRequestBody("text/plain".toMediaTypeOrNull()) -
Anfrage ausführen: Rufen Sie die Methode der Retrofit-Schnittstelle auf und übergeben Sie die erstellten Teile.
// Injektieren oder eine Instanz von FileApi erhalten val api: FileApi = ... // In einer Coroutine oder einem anderen asynchronen Kontext try { val descriptionPart = "Meine Datei".toRequestBody("text/plain".toMediaTypeOrNull()) val fileToUpload = File("pfad/zur/datei") 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) { // Datei erfolgreich hochgeladen } else { // Fehlerbehandlung } } catch (e: Exception) { // Ausnahmebehandlung }
Zusätzliche Aspekte:
- Upload-Fortschritt: Es ist möglich,
RequestBodymit Fortschrittsüberwachung zu implementieren, um einen Ladeindikator anzuzeigen. - Große Dateien: Für sehr große Dateien sollte Streaming oder Aufteilung in Teile in Betracht gezogen werden.
- Fehlerbehandlung: Überprüfen Sie die Server-Antwortcodes und behandeln Sie Netzwerkfehler.
- Berechtigungen: Stellen Sie sicher, dass die App die Berechtigung zum Lesen von Dateien hat (
READ_EXTERNAL_STORAGEauf älteren Android-Versionen). - ViewModel/Repository: Platzieren Sie die Logik zum Hochladen der Datei in einem Repository oder ViewModel für eine bessere Architektur.
- WorkManager: Verwenden Sie ihn für Hintergrund-Uploads, die auch nach Schließen der App fortgesetzt werden sollen.
Vorteile von MultipartBody:
- Standardmethode zum Senden von Dateien mit zusätzlichen Daten.
- Wird von den meisten Server-Frameworks unterstützt.
- Lässt sich gut in Retrofit integrieren.
Dies ist ein zuverlässiger und weit verbreiteter Ansatz zum Hochladen von Dateien in Android.