Ինչպե՞ս կիրականացնեիք ֆայլերի բեռնումը սերվերային հավելվածում։
sobes.tech AI
Պատասխան AI-ից
Ֆայլեր բեռնելու համար ես օգտագործում MultipartBody Retrofit գրադարանի։
-
API ինտերֆեյսի պատրաստում: Ստեղծում ենք ինտերֆեյս
@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-ի։// Ֆայլի համար 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 ինտերֆեյսի մեթոդը, փոխանցելով ստեղծված մասերը։
// Injekt կամ ստանում ենք FileApi-ի ինստանս val api: FileApi = ... // Կորուտին կամ այլ ասինխրոն կոնտեքստում 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: Ֆայլի բեռնման տրամաբանությունը տեղադրել ռեպոզիտորիայում կամ ViewModel-ում ավելի լավ ճարտարապետության համար։
- WorkManager: Օգտագործել ֆոնային բեռնման համար, որը պետք է շարունակվի նույնիսկ եթե հավելվածը փակվի։
MultipartBody-ի առավելությունները:
- Ստանդարտ միջոց ֆայլեր ուղարկելու համար լրացուցիչ տվյալներով։
- Աջակցվում է մեծ մասամբ սերվերային ֆրեյմվորկների կողմից։
- Լավ ինտեգրվում է Retrofit-ի հետ։
Սա հուսալի և լայնորեն օգտագործվող մոտեցում է ֆայլեր բեռնելու համար Android-ում։