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.
-
API arayüzünü hazırlama:
@Multipartve@POSTanotasyonlarıyla bir arayüz oluşturuyoruz. Metot, dosya için@Partve 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> } -
MultipartBody.Part oluşturma:
FileveyaUri'yiRequestBody'ye, ardındanMultipartBody.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)createFormDataiçindeki"file"ismi, sunucunun beklediği parametre ismiyle eşleşmelidir. -
Diğer parçalar için RequestBody oluşturma: Diğer verileri (metin, sayılar) göndermek için
RequestBodykullanılır.val description = "Dosya açıklaması".toRequestBody("text/plain".toMediaTypeOrNull()) -
İ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
RequestBodyimplementasyonu 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_STORAGEeski 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.