Sobes.tech
Middle

Sunucu uygulamasına dosya yüklemeyi nasıl gerçekleştirirdiniz?

sobes.tech yapay zeka

AI'dan gelen yanıt

Dosya yüklemek için Retrofit kütüphanesinden MultipartBody kullanırdım.

  1. API arayüzünü hazırlama: @Multipart ve @POST anotasyonlarıyla bir arayüz oluşturuyoruz. Metot, dosya için @Part ve varsa diğer istek parçalarını alır.

    interface FileApi {
        @Multipart
        @POST("/upload")
        suspend fun uploadFile(
            @Part file: MultipartBody.Part,
            @Part("description") description: RequestBody? = null
        ): Response<ResponseBody>
    }
    
  2. MultipartBody.Part oluşturma: File veya Uri'yi RequestBody'ye, ardından MultipartBody.Part'ye dönüştürüyoruz.

    // File için
    val file = File("yol/dosya")
    val requestFile = file.asRequestBody("multipart/form-data".toMediaTypeOrNull())
    val filePart = MultipartBody.Part.createFormData("file", file.name, requestFile)
    
    // Uri için
    val uri = Uri.parse("...") // Uri alınır
    val inputStream = context.contentResolver.openInputStream(uri)
    val requestBody = inputStream!!.readBytes().toRequestBody("multipart/form-data".toMediaTypeOrNull(), 0, inputStream.available())
    val filePart = MultipartBody.Part.createFormData("file", "dosya_adi", requestBody)
    

    createFormData içindeki "file" ismi, sunucunun beklediği parametre ismiyle eşleşmelidir.

  3. Diğer parçalar için RequestBody oluşturma: Diğer verileri (metin, sayılar) göndermek için RequestBody kullanılır.

    val description = "Dosya açıklaması".toRequestBody("text/plain".toMediaTypeOrNull())
    
  4. İsteği gerçekleştirme: Retrofit arayüz metodunu çağırıp, oluşturulan parçaları geçiriyoruz.

    // FileApi örneği enjekte edilir veya alınır
    val api: FileApi = ...
    
    // Coroutine veya başka bir asenkron bağlamda
    try {
        val descriptionPart = "Benim dosyam".toRequestBody("text/plain".toMediaTypeOrNull())
        val fileToUpload = File("yol/dosya")
        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) {
            // Dosya başarıyla yüklendi
        } else {
            // Hata işleme
        }
    } catch (e: Exception) {
        // İstisna işleme
    }
    

Ekstra noktalar:

  • Yükleme ilerlemesi: İlerleme takibi yapan RequestBody implementasyonu yapılarak yükleme göstergesi gösterilebilir.
  • Büyük dosyalar: Çok büyük dosyalar için streaming veya bölme düşünülmeli.
  • Hata yönetimi: Sunucu yanıt kodları kontrol edilmeli ve ağ hataları işlenmeli.
  • İzinler: Uygulamanın dosya okuma izni olduğundan emin olunmalı (READ_EXTERNAL_STORAGE eski Android sürümlerinde).
  • ViewModel/Repository: Dosya yükleme mantığı, mimari için repository veya ViewModel'de tutulmalı.
  • WorkManager: Arka plan yüklemeleri için kullanılmalı, uygulama kapatıldığında bile devam etmesi sağlanmalı.

MultipartBody avantajları:

  • Ek verilerle dosya göndermek için standart yöntem.
  • Çoğu sunucu çerçevesi tarafından desteklenir.
  • Retrofit ile iyi entegre olur.

Bu, Android'de dosya yükleme için güvenilir ve yaygın kullanılan bir yaklaşımdır.