Sobes.tech
Middle

Server tətbiqinə faylların yüklənməsini necə həyata keçirərdiniz?

sobes.tech Süni İntellekt

AI-dan cavab

Faylları yükləmək üçün Retrofit kitabxanasından MultipartBody istifadə edərdim.

  1. API interfeysinin hazırlanması: @Multipart@POST annotasiyaları ilə interfeys yaradırıq. Metod fayl üçün @Part və digər sorğu hissələri üçün qəbul edir, əgər varsa.

    interface FileApi {
        @Multipart
        @POST("/upload")
        suspend fun uploadFile(
            @Part file: MultipartBody.Part,
            @Part("description") description: RequestBody? = null
        ): Response<ResponseBody>
    }
    
  2. MultipartBody.Part yaradılması: File və ya Uri-ni RequestBody-yə və sonra MultipartBody.Part-a çeviririk.

    // File üçün
    val file = File("yol/filə")
    val requestFile = file.asRequestBody("multipart/form-data".toMediaTypeOrNull())
    val filePart = MultipartBody.Part.createFormData("file", file.name, requestFile)
    
    // Uri üçün
    val uri = Uri.parse("...") // Uri əldə edilir
    val inputStream = context.contentResolver.openInputStream(uri)
    val requestBody = inputStream!!.readBytes().toRequestBody("multipart/form-data".toMediaTypeOrNull(), 0, inputStream.available())
    val filePart = MultipartBody.Part.createFormData("file", "fayl_adi", requestBody)
    

    "file" adının createFormData-da server tərəfindən gözlənilən parametr adı ilə uyğun olması vacibdir.

  3. Digər hissələr üçün RequestBody yaradılması: Əgər digər məlumatlar (mətin, ədədlər) göndəriləcəkdirsə, RequestBody istifadə olunur.

    val description = "Faylın təsviri".toRequestBody("text/plain".toMediaTypeOrNull())
    
  4. Sorğunun icrası: Retrofit interfeysindən metodu çağırırıq, yaradılmış hissələri ötürürük.

    // FileApi nümunəsini injekt etmək və ya əldə etmək
    val api: FileApi = ...
    
    // Korutina və ya digər asinxron kontekst
    try {
        val descriptionPart = "Mənim faylım".toRequestBody("text/plain".toMediaTypeOrNull())
        val fileToUpload = File("yol/filə")
        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) {
            // Fayl uğurla yükləndi
        } else {
            // Xəta ilə işləmək
        }
    } catch (e: Exception) {
        // İstisnaya işləmək
    }
    

Əlavə aspektlər:

  • Yükləmə proqresi: Proqresi izləyən RequestBody-ni həyata keçirmək olar, yükləmə göstəricisi göstərmək üçün.
  • Böyük fayllar: Çox böyük fayllar üçün streaming və ya hissələrə bölmə nəzərdən keçirilə bilər.
  • Xəta işləmə: Serverin cavab kodlarını yoxlamaq və şəbəkə xətalarını idarə etmək.
  • İcazələr: Tətbiqin faylları oxumağa icazəsi olduğundan əmin olmaq (READ_EXTERNAL_STORAGE köhnə Android versiyalarında).
  • ViewModel/Repository: Fayl yükləmə məntiqini repository və ya ViewModel-də yerləşdirmək daha yaxşı arxitektura üçün.
  • WorkManager: Fon yükləməsi üçün istifadə edilə bilər, tətbiq bağlandıqda belə davam etməlidir.

MultipartBody-nin üstünlükləri:

  • Əlavə məlumatlarla fayl göndərmək üçün standart üsul.
  • Əksər server çərçivələri tərəfindən dəstəklənir.
  • Retrofit ilə yaxşı inteqrasiya olunur.

Bu, Android-də fayl yükləmək üçün etibarlı və geniş istifadə olunan yanaşmadır.