Serverdə tətbiq vasitəsilə faylların yüklənməsini necə həyata keçirərdiniz?
sobes.tech Süni İntellekt
AI-dan cavab
Faylların ölçüsünə, etibarlılıq tələblərinə və server imkanlarına əsasən bir neçə yanaşma istifadə etmək mümkündür.
1. Multipart/form-data ilə HTTP POST sorğusu:
Bu, faylları HTTP vasitəsilə göndərməyin standart üsuludur.
// Retrofit və OkHttp ilə nümunə
interface FileUploadService {
@Multipart
@POST("/upload")
suspend fun uploadFile(
@Part file: MultipartBody.Part
): Response<ResponseBody>
}
// Kodda
val file = File("yol/fayl.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)
- Üstünlüklər: Standart, geniş dəstək olunan yanaşma. Kiçik və orta ölçülü fayllar üçün uyğundur.
- Çatışmazlıqlar: Böyük fayllar üçün effektiv olmaya bilər, çünki faylın bütününü yaddaşa yükləmək tələb olunur. Dayanma və davam etdirmə dəstəyi yoxdur.
2. Asinxron yükləmə üçün kitabxanalar:
OkHttp kimi kitabxanalar mövcuddur və axın mexanizmi ilə faylları göndərməyə imkan verir, bu da böyük fayllar üçün daha effektivdir.
// OkHttp ilə nümunə
val client = OkHttpClient()
val file = File("yol/böyük/fayl.zip")
val requestBody = file.asRequestBody("application/octet-stream".toMediaTypeOrNull())
val request = Request.Builder()
.url("http://sizin_server/upload")
.post(requestBody)
.build()
client.newCall(request).enqueue(object : Callback {
override fun onFailure(call: Call, e: IOException) {
// Xəta ilə işləmə
}
override fun onResponse(call: Call, response: Response) {
if (response.isSuccessful) {
// Uğurlu yükləmə
} else {
// Xəta ilə işləmə
}
}
})
- Üstünlüklər: Böyük fayllar üçün effektiv, axım rejimində göndərmə. Daha çox elastiklik.
- Çatışmazlıqlar: Proqres və xətaların idarə olunması üçün daha çox kod tələb edir.
3. Fon xidmətləri və davam etdirmə dəstəyi (WorkManager):
Uzun müddətli və ya əlaqə kəsildikdə etibarlı fon yükləmələri üçün WorkManager istifadə etmək tövsiyə olunur. Bu, tapşırıqların yerinə yetirilməsini təmin edir, hətta tətbiq bağlanıb və ya cihaz yenidən başlatılıbsa belə.
Fayl yükləmə tapşırığını WorkManager daxilində həyata keçirmək mümkündür. Əgər yükləmə kəsilərsə, WorkManager onun davam etdirilməsini təmin edəcək.
// Fayl yükləmə üçün Work Request nümunəsi
val uploadRequest = OneTimeWorkRequestBuilder<FileUploadWorker>()
.setInputData(
workDataOf(
FileUploadWorker.KEY_FILE_URI to fileUri.toString(),
FileUploadWorker.KEY_UPLOAD_URL to "http://sizin_server/upload"
)
)
.setConstraints(
Constraints.Builder()
.setRequiredNetworkType(NetworkType.METERED) // Yalnız şəbəkə mövcuddursa
.build()
)
.build()
WorkManager.getInstance(context).enqueue(uploadRequest)
// FileUploadWorker nümunəsi (Worker daxilində həyata keçirilməsi)
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)
// Faylın yüklənməsi logikasını həyata keçirmək, OkHttp və ya başqa kitabxanadan istifadə
// Proqres və xətaların idarə olunması
return try {
// uploadFileBlockingAsync() funksiyasının yükləməni həyata keçirdiyini düşünürük
uploadFileBlockingAsync(fileUri, uploadUrl)
Result.success()
} catch (e: Exception) {
// Xəta baş verərsə, WorkManager yenidən cəhd edəcək
Result.retry()
}
}
companion object {
const val KEY_FILE_URI = "file_uri"
const val KEY_UPLOAD_URL = "upload_url"
}
}
- Üstünlüklər: Etibarlı fon yükləmə, avtomatik davam etdirmə, sistem resurslarının idarə olunması.
- Çatışmazlıqlar: Daha çox konfiqurasiya və WorkManager anlayışını başa düşməyi tələb edir.
Yol seçimi aşağıdakı amillərə bağlıdır:
- Faylın ölçüsü: Böyük fayllar üçün axım və ya WorkManager üstünlük təşkil edir.
- Etibarlılıq: Əhəmiyyətli yükləmələr üçün WorkManager ən yaxşı seçimdir.
- Fon işlərinin tələbi: Yükləmə fon rejimində olmalıdırsa, WorkManager istifadə edin.
- İcra çətinliyi: Sadə HTTP POST sorğuları kiçik fayllar üçün daha asandır.
Əlavə nəzərə alınmalı məsələlər:
- Proqresin göstərilməsi: İstifadəçiyə yükləmə proqresini göstərmək vacibdir, xüsusən böyük fayllar üçün.
- Xəta idarəetməsi: Müxtəlif xətaları, məsələn, şəbəkə problemləri, server xətaları və s. idarə etmək lazımdır.
- Təhlükəsizlik: Faylların yüklənməsi təhlükəsiz əlaqə (HTTPS) vasitəsilə həyata keçirilməlidir.
- Server məhdudiyyətləri: Serverinizin fayl ölçüsü və eyni vaxtda edilən sorğular sayı üçün məhdudiyyətlərini nəzərə alın.
- Autentifikasiya/İcazə: Əgər server bu tələb edirsə, onu yükləmə sorğularına daxil edin.
Ən çox, sadə hallarda multipart/form-data ilə HTTP POST-dan başlayardım və daha mürəkkəb ssenarilər və böyük fayllar üçün axım və WorkManager-ə keçərdim.