Cum ați implementa încărcarea fișierelor într-o aplicație server?
sobes.tech AI
Răspuns de la AI
Pentru încărcarea fișierelor, aș folosi MultipartBody din biblioteca Retrofit.
-
Pregătirea interfeței API: Creăm o interfață cu adnotările
@Multipartși@POST. Metoda acceptă@Partpentru fișier și alte părți ale cererii, dacă există.interface FileApi { @Multipart @POST("/upload") suspend fun uploadFile( @Part file: MultipartBody.Part, @Part("description") description: RequestBody? = null ): Response<ResponseBody> } -
Crearea MultipartBody.Part: Convertim
FilesauUriînRequestBody, apoi înMultipartBody.Part.// Pentru File val file = File("cale/catre/fisier") val requestFile = file.asRequestBody("multipart/form-data".toMediaTypeOrNull()) val filePart = MultipartBody.Part.createFormData("file", file.name, requestFile) // Pentru Uri val uri = Uri.parse("...") // Obțineți 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", "nume_fisier", requestBody)Numele
"file"încreateFormDatatrebuie să corespundă cu numele parametrului așteptat de server. -
Crearea RequestBody pentru alte părți: Dacă trebuie să trimiteți alte date (text, numere), folosiți
RequestBody.val description = "Descriere fișier".toRequestBody("text/plain".toMediaTypeOrNull()) -
Executarea cererii: Apelați metoda din interfața Retrofit, trecând părțile create.
// Injectați sau obțineți o instanță de FileApi val api: FileApi = ... // Într-o coroutine sau alt context asincron try { val descriptionPart = "Fișierul meu".toRequestBody("text/plain".toMediaTypeOrNull()) val fileToUpload = File("cale/catre/fisier") 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) { // Fișier încărcat cu succes } else { // Tratarea erorii } } catch (e: Exception) { // Tratarea excepției }
Aspecte suplimentare:
- Progresul încărcării: Se poate implementa
RequestBodycu monitorizare a progresului pentru a afișa un indicator de încărcare. - Fișiere mari: Pentru fișiere foarte mari, se poate considera streaming sau împărțirea în părți.
- Gestionarea erorilor: Verificați codurile de răspuns ale serverului și tratați erorile de rețea.
- Permisiuni: Asigurați-vă că aplicația are permisiunea de a citi fișierele (
READ_EXTERNAL_STORAGEpe versiunile mai vechi de Android). - ViewModel/Repository: Plasați logica de încărcare a fișierelor într-un repository sau ViewModel pentru o arhitectură mai bună.
- WorkManager: Folosiți-l pentru încărcări în fundal care trebuie să continue chiar dacă aplicația este închisă.
Avantajele MultipartBody:
- Metodă standard pentru trimiterea fișierelor cu date suplimentare.
- Suportat de majoritatea framework-urilor server.
- Se integrează bine cu Retrofit.
Aceasta este o abordare fiabilă și larg utilizată pentru încărcarea fișierelor în Android.