Как бихте реализирали качването на файлове към сървърно приложение?
sobes.tech AI
Отговор от AI
За качване на файлове бих използвал MultipartBody от библиотеката Retrofit.
-
Подготовка на API интерфейса: Създаваме интерфейс с анотации
@Multipartи@POST. Методът приема@Partза файла и други части на заявката, ако има.interface FileApi { @Multipart @POST("/upload") suspend fun uploadFile( @Part file: MultipartBody.Part, @Part("description") description: RequestBody? = null ): Response<ResponseBody> } -
Създаване на MultipartBody.Part: Преобразуваме
FileилиUriвRequestBody, а след това вMultipartBody.Part.// За File val file = File("път/до/файл") val requestFile = file.asRequestBody("multipart/form-data".toMediaTypeOrNull()) val filePart = MultipartBody.Part.createFormData("file", file.name, requestFile) // За Uri val uri = Uri.parse("...") // Получаване на 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", "име_на_файл", requestBody)Името
"file"вcreateFormDataтрябва да съвпада с името на параметъра, което очаква сървърът. -
Създаване на RequestBody за други части: Ако трябва да изпратите други данни (текст, числа), използвайте
RequestBody.val description = "Описание на файла".toRequestBody("text/plain".toMediaTypeOrNull()) -
Изпълнение на заявката: Викаме метода от Retrofit интерфейса, предавайки създадените части.
// Инжектиране или получаване на инстанс на FileApi val api: FileApi = ... // В корутина или друг асинхронен контекст try { val descriptionPart = "Моят файл".toRequestBody("text/plain".toMediaTypeOrNull()) val fileToUpload = File("път/до/файл") 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) { // Файл успешно качен } else { // Обработка на грешка } } catch (e: Exception) { // Обработка на изключение }
Допълнителни аспекти:
- Прогрес на качване: Може да се реализира
RequestBodyс проследяване на прогреса, за да се показва индикатор за качване. - Големи файлове: За много големи файлове разгледайте стрийминг или разделяне на части.
- Обработка на грешки: Проверявайте кодовете за отговор на сървъра и обработвайте мрежовите грешки.
- Разрешения: Уверете се, че приложението има разрешение за четене на файлове (
READ_EXTERNAL_STORAGE) на по-старите версии на Android. - ViewModel/Repository: Логиката за качване на файл да се постави в репозитория или ViewModel за по-добра архитектура.
- WorkManager: Използвайте за фоново качване, което трябва да продължи дори ако приложението е затворено.
Предимства на MultipartBody:
- Стандартен начин за изпращане на файлове с допълнителни данни.
- Поддържа се от повечето сървърни рамки.
- Добре се интегрира с Retrofit.
Това е надежден и широко използван подход за качване на файлове в Android.