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 кылып өзгөртөбүз.

    // Файл үчүн
    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 менен прогрессти көзөмөлдөөгө болот, жүктөө көрсөткүчүн көрсөтүү үчүн.
  • Өтө чоң файлдар: Өтө чоң файлдар үчүн streaming же бөлүктөргө бөлүү каралат.
  • Ката иштетүү: Сервердин жооп коддорун текшерип, тармак каталарын иштетүү.
  • Рухсаттар: Аппликацияда файлдарды окууга уруксат бар экенине ишениңиз (READ_EXTERNAL_STORAGE) эски Android версияларында.
  • ViewModel/Repository: Файл жүктөө логикасын репозиторий же ViewModelге жайгаштырыңыз жакшы архитектура үчүн.
  • WorkManager: Артында жүктөө үчүн колдонуу, ал колдонуу жабылганда да уланат.

MultipartBodyдин артыкчылыктары:

  • Кошумча маалыматтар менен файлдарды жөнөтүү үчүн стандарттык ыкма.
  • Көпчүлүк сервердик frameworkтер тарабынан колдоого алынат.
  • Retrofit менен жакшы интеграцияланат.

Бул Androidде файлдарды жүктөө үчүн ишенимдүү жана кеңири колдонулган ыкма.