Sobes.tech
Middle

Πώς θα υλοποιούσατε τη φόρτωση αρχείων σε μια διακομιστική εφαρμογή;

sobes.tech AI

Απάντηση από AI

Για τη φόρτωση αρχείων θα χρησιμοποιούσα το MultipartBody από τη βιβλιοθήκη Retrofit.

  1. Προετοιμασία του API interface: Δημιουργούμε ένα interface με τις σημάνσεις @Multipart και @POST. Η μέθοδος δέχεται @Part για το αρχείο και άλλα μέρη του αιτήματος, αν υπάρχουν.

    interface FileApi {
        @Multipart
        @POST("/upload")
        suspend fun uploadFile(
            @Part file: MultipartBody.Part,
            @Part("description") description: RequestBody? = null
        ): Response<ResponseBody>
    }
    
  2. Δημιουργία MultipartBody.Part: Μετατρέπουμε το File ή Uri σε RequestBody, και στη συνέχεια σε MultipartBody.Part.

    // Για File
    val file = File("διαδρομή/στο/αρχείο")
    val requestFile = file.asRequestBody("multipart/form-data".toMediaTypeOrNull())
    val filePart = MultipartBody.Part.createFormData("file", file.name, requestFile)
    
    // Για Uri
    val uri = Uri.parse("...") // Λήψη 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", "όνομα_αρχείου", requestBody)
    

    Το όνομα "file" στο createFormData πρέπει να ταιριάζει με το όνομα της παραμέτρου που αναμένει ο διακομιστής.

  3. Δημιουργία RequestBody για άλλα μέρη: Αν χρειάζεται να σταλεί και άλλες πληροφορίες (κείμενο, αριθμοί), χρησιμοποιούμε το RequestBody.

    val description = "Περιγραφή αρχείου".toRequestBody("text/plain".toMediaTypeOrNull())
    
  4. Εκτέλεση του αιτήματος: Καλούμε τη μέθοδο από το Retrofit interface, περνώντας τα δημιουργημένα μέρη.

    // Εισάγουμε ή λαμβάνουμε το instance του FileApi
    val api: FileApi = ...
    
    // Σε coroutine ή άλλο ασύγχρονο πλαίσιο
    try {
        val descriptionPart = "Το αρχείο μου".toRequestBody("text/plain".toMediaTypeOrNull())
        val fileToUpload = File("διαδρομή/στο/αρχείο")
        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) {
            // Το αρχείο ανέβηκε επιτυχώς
        } else {
            // Διαχείριση σφάλματος
        }
    } catch (e: Exception) {
        // Διαχείριση εξαίρεσης
    }
    

Πρόσθετες πτυχές:

  • Πρόοδος φόρτωσης: Μπορεί να υλοποιηθεί RequestBody με παρακολούθηση προόδου, για εμφάνιση δείκτη φόρτωσης.
  • Μεγάλα αρχεία: Για πολύ μεγάλα αρχεία, εξετάστε streaming ή διαχωρισμό σε μέρη.
  • Διαχείριση σφαλμάτων: Έλεγχος κωδικών απόκρισης διακομιστή και διαχείριση δικτυακών σφαλμάτων.
  • Άδειες: Βεβαιωθείτε ότι η εφαρμογή έχει άδεια ανάγνωσης αρχείων (READ_EXTERNAL_STORAGE σε παλαιότερες εκδόσεις Android).
  • ViewModel/Repository: Τοποθετήστε τη λογική φόρτωσης αρχείων σε repository ή ViewModel για καλύτερη αρχιτεκτονική.
  • WorkManager: Χρησιμοποιήστε για φόντο φόρτωσης που πρέπει να συνεχίζεται ακόμα και αν κλείσει η εφαρμογή.

Πλεονεκτήματα του MultipartBody:

  • Τυπικός τρόπος αποστολής αρχείων με επιπλέον δεδομένα.
  • Υποστηρίζεται από τις περισσότερες πλατφόρμες διακομιστή.
  • Καλά ενσωματώνεται με το Retrofit.

Αυτή είναι μια αξιόπιστη και ευρέως χρησιμοποιούμενη προσέγγιση για φόρτωση αρχείων σε Android.