Middle
Ako by ste implementovali nahrávanie súborov do serverovej aplikácie?
sobes.tech AI
Odpoveď od AI
Na nahrávanie súborov by som použil MultipartBody z knižnice Retrofit.
-
Príprava API rozhrania: Vytvoríme rozhranie s anotáciami
@Multiparta@POST. Metóda prijíma@Partpre súbor a ďalšie časti požiadavky, ak sú.interface FileApi { @Multipart @POST("/upload") suspend fun uploadFile( @Part file: MultipartBody.Part, @Part("description") description: RequestBody? = null ): Response<ResponseBody> } -
Vytvorenie MultipartBody.Part: Prevedieme
FilealeboUrinaRequestBody, a potom naMultipartBody.Part.// Pre File val file = File("cesta/k/suboru") val requestFile = file.asRequestBody("multipart/form-data".toMediaTypeOrNull()) val filePart = MultipartBody.Part.createFormData("file", file.name, requestFile) // Pre Uri val uri = Uri.parse("...") // Získanie 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", "meno_suboru", requestBody)Názov
"file"vcreateFormDatamusí zodpovedať názvu parametra, ktorý očakáva server. -
Vytvorenie RequestBody pre ďalšie časti: Ak je potrebné odoslať iné údaje (text, čísla), používame
RequestBody.val description = "Popis súboru".toRequestBody("text/plain".toMediaTypeOrNull()) -
Vykonanie požiadavky: Voláme metódu z rozhrania Retrofit, odovzdávajúc vytvorené časti.
// Injektovanie alebo získanie inštancie FileApi val api: FileApi = ... // V coroutine alebo inom asynchrónnom kontexte try { val descriptionPart = "Môj súbor".toRequestBody("text/plain".toMediaTypeOrNull()) val fileToUpload = File("cesta/k/suboru") 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) { // Súbor úspešne nahraný } else { // Spracovanie chyby } } catch (e: Exception) { // Spracovanie výnimky }
Ďalšie aspekty:
- Progres nahrávania: Môže byť implementovaný
RequestBodys sledovaním pokroku, aby sa zobrazil indikátor nahrávania. - Veľké súbory: Pre veľmi veľké súbory zvážte streaming alebo delenie na časti.
- Spracovanie chýb: Kontrolujte kódy odpovede servera a spracovávajte sieťové chyby.
- Oprávnenia: Uistite sa, že aplikácia má oprávnenie na čítanie súborov (
READ_EXTERNAL_STORAGE) na starších verziách Androidu. - ViewModel/Repository: Logiku nahrávania súboru umiestnite do repository alebo ViewModelu pre lepšiu architektúru.
- WorkManager: Použite na pozadinské nahrávanie, ktoré má pokračovať aj pri zatvorení aplikácie.
Výhody MultipartBody:
- Štandardný spôsob na odosielanie súborov s doplnkovými údajmi.
- Podporované väčšinou serverových frameworkov.
- Dobré sa integruje s Retrofitom.
Toto je spoľahlivý a široko používaný prístup na nahrávanie súborov v Android.