Sobes.tech
Middle

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.

  1. API-Schnittstelle vorbereiten: Erstellen Sie eine Schnittstelle mit den Anmerkungen @Multipart und @POST. Die Methode akzeptiert @Part fü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>
    }
    
  2. MultipartBody.Part erstellen: Konvertieren Sie File oder Uri in RequestBody und dann in MultipartBody.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" in createFormData muss mit dem Parametername auf Serverseite übereinstimmen.

  3. RequestBody für andere Teile erstellen: Wenn andere Daten (Text, Zahlen) gesendet werden sollen, verwenden Sie RequestBody.

    val description = "Dateibeschreibung".toRequestBody("text/plain".toMediaTypeOrNull())
    
  4. 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, RequestBody mit 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_STORAGE auf ä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.