Sobes.tech
Middle

Bir uygulama aracılığıyla sunucuya dosya yükleme işlemini nasıl gerçekleştirirdiniz?

sobes.tech yapay zeka

AI'dan gelen yanıt

Dosya boyutuna, güvenilirlik gereksinimlerine ve sunucu yeteneklerine bağlı olarak çeşitli yaklaşımlar kullanılabilir.

1. multipart/form-data ile HTTP POST isteği:

Bu, dosyaları HTTP üzerinden göndermenin standart yoludur.

// Retrofit ve OkHttp kullanımı örneği
interface FileUploadService {
    @Multipart
    @POST("/upload")
    suspend fun uploadFile(
        @Part file: MultipartBody.Part
    ): Response<ResponseBody>
}

// Kodda
val file = File("dosya/yolu/dosya.txt")
val requestFile = file.asRequestBody("multipart/form-data".toMediaTypeOrNull())
val body = MultipartBody.Part.createFormData("file", file.name, requestFile)

val service = retrofit.create(FileUploadService::class.java)
val response = service.uploadFile(body)
  • Artıları: Standart, geniş destekleniyor. Küçük ve orta boyutlu dosyalar için uygundur.
  • Eksileri: Büyük dosyalar için verimli olmayabilir, çünkü tüm dosya belleğe yüklenir ve gönderilir. Kesintili yüklemeleri devam ettirme desteği yoktur.

2. Asenkron yükleme kütüphaneleri:

OkHttp gibi akış mekanizmasına sahip kütüphaneler, büyük dosyalar için daha verimli olan akış modunda dosya göndermeye olanak tanır.

// OkHttp ile örnek
val client = OkHttpClient()
val file = File("dosya/yolu/büyük_dosya.zip")

val requestBody = file.asRequestBody("application/octet-stream".toMediaTypeOrNull())

val request = Request.Builder()
    .url("http://sunucu_adresi/upload")
    .post(requestBody)
    .build()

client.newCall(request).enqueue(object : Callback {
    override fun onFailure(call: Call, e: IOException) {
        // Hata işleme
    }

    override fun onResponse(call: Call, response: Response) {
        if (response.isSuccessful) {
            // Başarılı yükleme
        } else {
            // Hata işleme
        }
    }
})
  • Artıları: Büyük dosyalar için verimli, akış modunda gönderim. Daha fazla esneklik.
  • Eksileri: İlerleme ve hataları işlemek için daha fazla kod gerekebilir.

3. Arka plan servisleri ve devam ettirme desteği (WorkManager):

Uzun süren işlemler veya bağlantı kesintileri durumunda güvenilir arka plan yüklemeleri için WorkManager kullanılması önerilir. Görevlerin uygulama kapalı olsa bile veya cihaz yeniden başlatılsa bile garantili şekilde yürütülmesini sağlar.

WorkManager içinde dosya yükleme görevi uygulanabilir. Yükleme kesilirse, WorkManager devam ettirir.

// Dosya yükleme için iş isteği örneği
val uploadRequest = OneTimeWorkRequestBuilder<FileUploadWorker>()
    .setInputData(
        workDataOf(
            FileUploadWorker.KEY_FILE_URI to fileUri.toString(),
            FileUploadWorker.KEY_UPLOAD_URL to "http://sunucu_adresi/upload"
        )
    )
    .setConstraints(
        Constraints.Builder()
            .setRequiredNetworkType(NetworkType.METERED) // Sadece ağ varsa
            .build()
    )
    .build()

WorkManager.getInstance(context).enqueue(uploadRequest)
// Worker içindeki FileUploadWorker örneği (uygulama)
class FileUploadWorker(
    appContext: Context,
    workerParams: WorkerParameters
) : CoroutineWorker(appContext, workerParams) {

    override suspend fun doWork(): Result {
        val fileUriString = inputData.getString(KEY_FILE_URI) ?: return Result.failure()
        val uploadUrl = inputData.getString(KEY_UPLOAD_URL) ?: return Result.failure()
        val fileUri = Uri.parse(fileUriString)

        // Dosya yükleme mantığını OkHttp veya başka bir kütüphane kullanarak uygulayın
        // İlerleme ve hata yönetimi

        return try {
            // uploadFileBlockingAsync() fonksiyonunun dosya yüklemesini yaptığı varsayılır
            uploadFileBlockingAsync(fileUri, uploadUrl)
            Result.success()
        } catch (e: Exception) {
            // Hata durumunda WorkManager tekrar deneyecektir
            Result.retry()
        }
    }

    companion object {
        const val KEY_FILE_URI = "file_uri"
        const val KEY_UPLOAD_URL = "upload_url"
    }
}
  • Artıları: Güvenilir arka plan yüklemesi, otomatik devam, sistem kaynaklarının yönetimi.
  • Eksileri: Daha fazla yapılandırma ve WorkManager kavramını anlamayı gerektirir.

Yöntem seçimi şu faktörlere bağlıdır:

  • Dosya boyutu: Büyük dosyalar için akış işleme veya WorkManager tercih edilmelidir.
  • Güvenilirlik: Kesintili önemli yüklemeler için WorkManager en iyi seçimdir.
  • Arka plan gereksinimi: Yükleme arka planda yapılacaksa, WorkManager kullanılmalıdır.
  • Uygulama karmaşıklığı: Basit HTTP POST istekleri küçük dosyalar için daha kolaydır.

Ekstra dikkate alınması gerekenler:

  • İlerleme durumu: Kullanıcıya yükleme ilerlemesini göstermek önemlidir, özellikle büyük dosyalar için.
  • Hata yönetimi: Ağ sorunları, sunucu hataları gibi çeşitli hatalar ele alınmalıdır.
  • Güvenlik: Dosya yüklemenin güvenli bağlantı (HTTPS) üzerinden yapılması sağlanmalıdır.
  • Sunucu kısıtlamaları: Sunucunuzun dosya boyutu ve eşzamanlı istekler üzerindeki sınırlamalarını göz önünde bulundurun.
  • Kimlik doğrulama/Yetkilendirme: Sunucu kimlik doğrulama gerektiriyorsa, bunu yükleme isteklerine dahil edin.

Genellikle, basit durumlar için multipart/form-data ile HTTP POST isteğiyle başlar ve daha karmaşık senaryolar ve büyük dosyalar için akış işleme ile WorkManager'a geçerim.