Middle
Jak byste implementovali nahrávání souborů do serverové aplikace?
sobes.tech AI
Odpověď od AI
Pro nahrávání souborů bych použil MultipartBody z knihovny Retrofit.
-
Příprava API rozhraní: Vytvoříme rozhraní s anotacemi
@Multiparta@POST. Metoda přijímá@Partpro soubor a další části požadavku, pokud jsou.interface FileApi { @Multipart @POST("/upload") suspend fun uploadFile( @Part file: MultipartBody.Part, @Part("description") description: RequestBody? = null ): Response<ResponseBody> } -
Vytvoření MultipartBody.Part: Převádíme
FileneboUrinaRequestBody, a poté naMultipartBody.Part.// Pro File val file = File("cesta/k/souboru") val requestFile = file.asRequestBody("multipart/form-data".toMediaTypeOrNull()) val filePart = MultipartBody.Part.createFormData("file", file.name, requestFile) // Pro Uri val uri = Uri.parse("...") // Získání 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", "název_souboru", requestBody)Název
"file"vcreateFormDatamusí odpovídat jménu parametru, které očekává server. -
Vytvoření RequestBody pro jiné části: Pokud je potřeba poslat jiné údaje (text, čísla), použijeme
RequestBody.val description = "Popis souboru".toRequestBody("text/plain".toMediaTypeOrNull()) -
Provedení požadavku: Voláme metodu z rozhraní Retrofit, předávající vytvořené části.
// Injektujeme nebo získáváme instanci FileApi val api: FileApi = ... // V coroutine nebo jiném asynchronním kontextu try { val descriptionPart = "Můj soubor".toRequestBody("text/plain".toMediaTypeOrNull()) val fileToUpload = File("cesta/k/souboru") 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) { // Soubor úspěšně nahrán } else { // Zpracování chyby } } catch (e: Exception) { // Zpracování výjimky }
Další aspekty:
- Progres nahrávání: Lze implementovat
RequestBodys sledováním pokroku, aby se zobrazil indikátor nahrávání. - Velké soubory: Pro velmi velké soubory zvážit streaming nebo rozdělení na části.
- Zpracování chyb: Kontrolovat kódy odpovědi serveru a zpracovávat síťové chyby.
- Oprávnění: Ujistit se, že aplikace má oprávnění ke čtení souborů (
READ_EXTERNAL_STORAGE) na starších verzích Androidu. - ViewModel/Repository: Logiku nahrávání souboru umístit do repository nebo ViewModelu pro lepší architekturu.
- WorkManager: Použít pro pozadí nahrávání, které má pokračovat i při zavření aplikace.
Výhody MultipartBody:
- Standardní způsob pro odesílání souborů s doplňkovými daty.
- Podporováno většinou serverových frameworků.
- Dobře se integruje s Retrofitem.
Toto je spolehlivý a široce používaný přístup k nahrávání souborů v Androidu.