Middle
Kaip įgyvendintumėte failų įkėlimą į serverio programą?
sobes.tech AI
Atsakymas iš AI
Failų įkėlimo atveju naudotume MultipartBody iš Retrofit bibliotekos.
-
API sąsajos paruošimas: Sukuriame sąsają su anotacija
@Multipartir@POST. Metodas priima@Partfailui ir kitus užklausos dalis, jei jų yra.interface FileApi { @Multipart @POST("/upload") suspend fun uploadFile( @Part file: MultipartBody.Part, @Part("description") description: RequestBody? = null ): Response<ResponseBody> } -
MultipartBody.Part sukūrimas: Konvertuojame
FilearbaUriįRequestBody, tada įMultipartBody.Part.// Failo atveju val file = File("kelias/iki/failo") val requestFile = file.asRequestBody("multipart/form-data".toMediaTypeOrNull()) val filePart = MultipartBody.Part.createFormData("file", file.name, requestFile) // Uri atveju val uri = Uri.parse("...") // gauname 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", "failo_vardas", requestBody)"file"pavadinimascreateFormDataturi atitikti serverio lauką. -
Kitiems duomenims sukurti RequestBody: Jei reikia siųsti kitus duomenis (tekstas, skaičiai), naudokite
RequestBody.val description = "Failo aprašymas".toRequestBody("text/plain".toMediaTypeOrNull()) -
Užklausos vykdymas: Iškvieskite Retrofit sąsajos metodą, perduodami sukurtas dalis.
// Injektuojame arba gauname FileApi instanciją val api: FileApi = ... // Korutinoje ar kitame asinchroniniame kontekste try { val descriptionPart = "Mano failas".toRequestBody("text/plain".toMediaTypeOrNull()) val fileToUpload = File("kelias/iki/failo") 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) { // Failas sėkmingai įkeltas } else { // Klaidos apdorojimas } } catch (e: Exception) { // Išimties apdorojimas }
Papildomi aspektai:
- Įkėlimo progresas: galima įgyvendinti
RequestBodysu progresu stebėjimu, kad rodytų įkėlimo indikatorius. - Dideli failai: labai dideliems failams svarstykite srautų perdavimą arba dalijimąsi į dalis.
- Klaidų apdorojimas: tikrinkite serverio atsakymo kodus ir tvarkykite tinklo klaidas.
- Leidimai: įsitikinkite, kad programai yra leidimas skaityti failus (
READ_EXTERNAL_STORAGEsenesnėse Android versijose). - ViewModel/Repository: failo įkėlimo logiką įdėkite į repository ar ViewModel geresnei architektūrai.
- WorkManager: naudokite foniniam įkėlimui, kuris turi tęstis net ir uždarius programą.
MultipartBody privalumai:
- Standartinis būdas siųsti failus su papildomais duomenimis.
- Palaikomas daugumos serverio karkasų.
- Gerai integruojasi su Retrofit.
Tai patikimas ir plačiai naudojamas būdas įkelti failus Android platformoje.