Sobes.tech
Middle

Как бихте реализирали качването на файлове към сървърно приложение?

sobes.tech AI

Отговор от AI

За качване на файлове бих използвал MultipartBody от библиотеката Retrofit.

  1. Подготовка на API интерфейса: Създаваме интерфейс с анотации @Multipart и @POST. Методът приема @Part за файла и други части на заявката, ако има.

    interface FileApi {
        @Multipart
        @POST("/upload")
        suspend fun uploadFile(
            @Part file: MultipartBody.Part,
            @Part("description") description: RequestBody? = null
        ): Response<ResponseBody>
    }
    
  2. Създаване на 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 трябва да съвпада с името на параметъра, което очаква сървърът.

  3. Създаване на RequestBody за други части: Ако трябва да изпратите други данни (текст, числа), използвайте RequestBody.

    val description = "Описание на файла".toRequestBody("text/plain".toMediaTypeOrNull())
    
  4. Изпълнение на заявката: Викаме метода от 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.