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: Логикаи боргузории файлро дар repository ё ViewModel ҷойгир кунед барои сохтори беҳтар.
  • WorkManager: Барои боргузории пасзамина истифода баред, ки ҳатто агар барнома баста шавад, идома ёбад.

Афзалиятҳои MultipartBody:

  • Равиши стандартӣ барои фиристодани файлҳо бо маълумоти иловагӣ.
  • Дар бештари серверҳо дастгирӣ мешавад.
  • Бо Retrofit хуб ҳамгиро мешавад.

Ин як рӯйхати боэътимод ва васеъ истифодашаванда барои боргузории файлҳо дар Android мебошад.