Πώς θα υλοποιούσατε τη φόρτωση αρχείων σε μια διακομιστική εφαρμογή;
sobes.tech AI
Απάντηση από AI
Για τη φόρτωση αρχείων θα χρησιμοποιούσα το MultipartBody από τη βιβλιοθήκη Retrofit.
-
Προετοιμασία του 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> } -
Δημιουργία 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πρέπει να ταιριάζει με το όνομα της παραμέτρου που αναμένει ο διακομιστής. -
Δημιουργία RequestBody για άλλα μέρη: Αν χρειάζεται να σταλεί και άλλες πληροφορίες (κείμενο, αριθμοί), χρησιμοποιούμε το
RequestBody.val description = "Περιγραφή αρχείου".toRequestBody("text/plain".toMediaTypeOrNull()) -
Εκτέλεση του αιτήματος: Καλούμε τη μέθοδο από το 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.