Hogyan valósítanád meg a fájlok feltöltését egy szerveralkalmazásba?
sobes.tech MI
Válasz az MI-től
Fájlok feltöltéséhez a Retrofit könyvtárból a MultipartBody-t használnám.
-
API interfész előkészítése: Létrehozunk egy interfészt
@Multipartés@POSTannotációkkal. A metódus@Part-okat fogad a fájlhoz és a kérés többi részéhez, ha vannak.interface FileApi { @Multipart @POST("/upload") suspend fun uploadFile( @Part file: MultipartBody.Part, @Part("description") description: RequestBody? = null ): Response<ResponseBody> } -
MultipartBody.Part létrehozása: Átalakítjuk a
File-t vagyUri-tRequestBody-vá, majdMultipartBody.Part-t készítünk.// Fájlhoz val file = File("útvonal/a/fájlhoz") val requestFile = file.asRequestBody("multipart/form-data".toMediaTypeOrNull()) val filePart = MultipartBody.Part.createFormData("file", file.name, requestFile) // Uri-hez val uri = Uri.parse("...") // Uri beszerzése val inputStream = context.contentResolver.openInputStream(uri) val requestBody = inputStream!!.readBytes().toRequestBody("multipart/form-data".toMediaTypeOrNull(), 0, inputStream.available()) val filePart = MultipartBody.Part.createFormData("file", "fájl_név", requestBody)A
"file"név acreateFormData-ban egyezzen meg a szerver által várt paraméter névvel. -
RequestBody létrehozása más részekhez: Ha más adatokat (szöveg, számok) kell küldeni, akkor
RequestBody-t használunk.val description = "Fájl leírása".toRequestBody("text/plain".toMediaTypeOrNull()) -
Kérés végrehajtása: Meghívjuk a Retrofit interfész metódusát, átadva a létrehozott részeket.
// FileApi példány injektálása vagy beszerzése val api: FileApi = ... // Coroutine vagy más aszinkron környezetben try { val descriptionPart = "A fájlom".toRequestBody("text/plain".toMediaTypeOrNull()) val fileToUpload = File("útvonal/a/fájlhoz") 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) { // Sikeres feltöltés } else { // Hiba kezelése } } catch (e: Exception) { // Kivétel kezelése }
További szempontok:
- Feltöltési folyamat: Megvalósítható
RequestBody-val, ami nyomon követi a folyamatot, és mutat egy betöltési indikátort. - Nagy fájlok: Nagyon nagy fájlok esetén streaming vagy darabolás javasolt.
- Hiba kezelés: Ellenőrizze a szerver válasz kódját, és kezelje a hálózati hibákat.
- Engedélyek: Győződjön meg arról, hogy az alkalmazás rendelkezik fájl olvasási engedéllyel (
READ_EXTERNAL_STORAGErégebbi Android verziókon). - ViewModel/Repository: A fájl feltöltési logikát helyezze el a repository-ban vagy ViewModel-ben a jobb architektúráért.
- WorkManager: Használja háttérben történő feltöltéshez, amely akkor is folytatódik, ha az alkalmazás bezáródik.
MultipartBody előnyei:
- Szabványos módszer fájlok és kiegészítő adatok küldésére.
- Támogatott a legtöbb szerveroldali keretrendszer által.
- Jól integrálódik a Retrofittel.
Ez egy megbízható és széles körben használt megközelítés fájlok feltöltésére Androidon.