Kako biste implementirali učitavanje fajlova u serversku aplikaciju?
sobes.tech АИ
Одговор од АИ
Za učitavanje fajlova koristio bih MultipartBody iz Retrofit biblioteke.
-
Priprema API interfejsa: Kreiramo interfejs sa anotacijama
@Multiparti@POST. Metoda prihvata@Partza fajl i ostale delove zahteva, ako ih ima.interface FileApi { @Multipart @POST("/upload") suspend fun uploadFile( @Part file: MultipartBody.Part, @Part("description") description: RequestBody? = null ): Response<ResponseBody> } -
Kreiranje MultipartBody.Part: Pretvaramo
FileiliUriuRequestBody, a zatim uMultipartBody.Part.// Za File val file = File("putanja/do/fajla") val requestFile = file.asRequestBody("multipart/form-data".toMediaTypeOrNull()) val filePart = MultipartBody.Part.createFormData("file", file.name, requestFile) // Za Uri val uri = Uri.parse("...") // Dobijanje 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", "ime_fajla", requestBody)Ime
"file"ucreateFormDatamora da bude isto kao i ime parametra koje očekuje server. -
Kreiranje RequestBody za ostale delove: Ako je potrebno poslati druge podatke (tekst, brojevi), koristimo
RequestBody.val description = "Opis fajla".toRequestBody("text/plain".toMediaTypeOrNull()) -
Izvršavanje zahteva: Pozivamo metodu iz Retrofit interfejsa, prosleđujući kreirane delove.
// Injektovanje ili dobijanje instance FileApi val api: FileApi = ... // U korutini ili drugom asinhronom kontekstu try { val descriptionPart = "Moj fajl".toRequestBody("text/plain".toMediaTypeOrNull()) val fileToUpload = File("putanja/do/fajla") 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) { // Fajl uspešno upload-ovan } else { // Obrada greške } } catch (e: Exception) { // Obrada izuzetka }
Dodatni aspekti:
- Progres učitavanja: Može se implementirati
RequestBodysa praćenjem napretka, za prikaz indikatora učitavanja. - Veliki fajlovi: Za veoma velike fajlove razmotriti streaming ili deljenje na delove.
- Obrada grešaka: Proveravati kodove odgovora servera i obrađivati mrežne greške.
- Dozvole: Uveriti se da aplikacija ima dozvolu za čitanje fajlova (
READ_EXTERNAL_STORAGE) na starijim verzijama Androida. - ViewModel/Repository: Logiku za učitavanje fajla staviti u repository ili ViewModel za bolju arhitekturu.
- WorkManager: Koristiti za pozadinsko učitavanje koje treba da se nastavi čak i ako je aplikacija zatvorena.
Prednosti MultipartBody:
- Standardan način za slanje fajlova sa dodatnim podacima.
- Podržava ga većina server-side framework-a.
- Dobro se integriše sa Retrofit-om.
Ovo je pouzdan i široko korišćen pristup za učitavanje fajlova u Android-u.