Чӣ гуна иҷро кардани боргирии файлҳо тавассути барнома дар серверро иҷро мекунед?
sobes.tech AI
Ҷавоб аз AI
Мушкил нест, ки чанд роҳро вобаста ба андозаи файлҳо, талабот ба эътимоднокӣ ва имкониятҳои сервер истифода бурда мешавад.
1. Арзиши HTTP POST бо multipart/form-data:
Ин усули стандартӣ барои фиристодани файлҳо тавассути HTTP мебошад.
// Мисол бо Retrofit ва OkHttp
interface FileUploadService {
@Multipart
@POST("/upload")
suspend fun uploadFile(
@Part file: MultipartBody.Part
): Response<ResponseBody>
}
// Дар код
val file = File("роҳ/ба/файли.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)
- Фоидаҳо: Равиши стандартӣ, васеъ дастгирӣ мешавад. Барои файлҳои хурду миёна мувофиқ аст.
- Норасоиҳо: Барои файлҳои калонтар метавонад самаранок набошад, зеро тамоми файл бояд дар хотира бор карда шавад пеш аз фиристодан. Дастгирии барқароркунии боркунии қатъшуда нест.
2. Китобхонаҳо барои боркунии асинхронӣ:
Мавҷуданд китобхонаҳо, масалан, OkHttp, ки имкон медиҳанд файлҳоро дар ҷараён фиристодан, ки барои файлҳои калонтар самараноктар аст.
// Мисол бо OkHttp
val client = OkHttpClient()
val file = File("роҳ/ба/файли/калон.zip")
val requestBody = file.asRequestBody("application/octet-stream".toMediaTypeOrNull())
val request = Request.Builder()
.url("http://сервери_шумо/upload")
.post(requestBody)
.build()
client.newCall(request).enqueue(object : Callback {
override fun onFailure(call: Call, e: IOException) {
// Ҳаллу фасл кардани хатогӣ
}
override fun onResponse(call: Call, response: Response) {
if (response.isSuccessful) {
// боркунии муваффақ
} else {
// Ҳаллу фасл кардани хатогӣ
}
}
})
- Фоидаҳо: Самаранок барои файлҳои калон, фиристодан дар ҷараён. Флексибиллии бештар.
- Норасоиҳо: Бояд код бештар барои пайгирии пешрафт ва хатогӣ навишт.
3. Хизматрасониҳои пасзамона бо дастгирии барқароркунӣ (WorkManager):
Барои боркунии боэътимод дар пасзамона, махсусан барои равандҳои дарозмуддат ё дар ҳолати қатъ шудани пайванд, тавсия дода мешавад, ки истифода бурда шавад WorkManager. Он кафолат медиҳад иҷрои вазифаҳо, ҳатто агар барнома баста шавад ё дастгоҳ навсозӣ шавад.
Шумо метавонед вазифаи боркунии файлро дар дохили WorkManager амалӣ кунед. Агар боркунӣ қатъ шавад, WorkManager онро идома медиҳад.
// Мисол барои дархости кор барои боркунии файл
val uploadRequest = OneTimeWorkRequestBuilder<FileUploadWorker>()
.setInputData(
workDataOf(
FileUploadWorker.KEY_FILE_URI to fileUri.toString(),
FileUploadWorker.KEY_UPLOAD_URL to "http://сервери_шумо/upload"
)
)
.setConstraints(
Constraints.Builder()
.setRequiredNetworkType(NetworkType.METERED) // Танҳо дар ҳолати шабака
.build()
)
.build()
WorkManager.getInstance(context).enqueue(uploadRequest)
// Мисол барои FileUploadWorker (имплементация дар дохили Worker)
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)
// Имплементацияи логикаи боркунии файл бо истифода аз OkHttp ё китобхонаи дигар
// Назорат бар пешрафт ва хатогӣ
return try {
// Гумон мекунем, ки функсияи uploadFileBlockingAsync() иҷро мекунад боркуниро
uploadFileBlockingAsync(fileUri, uploadUrl)
Result.success()
} catch (e: Exception) {
// Агар хатогӣ рӯй диҳад, WorkManager кӯшиш мекунад дубора
Result.retry()
}
}
companion object {
const val KEY_FILE_URI = "file_uri"
const val KEY_UPLOAD_URL = "upload_url"
}
}
- Фоидаҳо: Боркунии боэътимод дар пасзамона, барқароркунии автоматӣ, идоракунии захираҳои системӣ.
- Норасоиҳо: Бештар танзимот ва фаҳмиши консепсияи WorkManager талаб мекунад.
Интихоби усул вобаста аст ба:
- Андозаи файл: Барои файлҳои калонтар, беҳтар аст потокӣ ё WorkManager.
- Боварӣ: Барои боркунии муҳим бо имконияти қатъ, WorkManager беҳтарин аст.
- Талабот ба кор дар пасзамона: Агар боркунӣ бояд дар пасзамона иҷро шавад, истифода баред WorkManager.
- Суръат ва мураккабият: Арзиши HTTP POST оддӣ барои файлҳои хурдтар осонтар аст.
Иловаи назария:
- Пешрафтро нишон додан: Муҳим аст, ки пешрафти боркунро ба корбар нишон диҳед, махсусан барои файлҳои калон.
- Обработкаи хатогӣ: Ҳар гуна хатогиро бояд баррасӣ кард, масалан, мушкилоти шабака, хатоҳои сервер ва ғайра.
- Бехатарӣ: Боварӣ ҳосил кунед, ки боркунӣ тавассути пайвасти бехатар (HTTPS) сурат мегирад.
- Маҳдудиятҳои сервер: Маҳдудиятҳои серверро дар назар гиред, масалан, андозаи максималии файл ва шумораи дархостҳои ҳамзамон.
- Аутентификация/Авторизация: Агар сервер талаб кунад, онро дар дархостҳо дохил кунед.
Ман одатан бо HTTP POST оддӣ бо multipart/form-data оғоз мекунам ва сипас ба потокӣ ё WorkManager бо коркарди файлҳои потокӣ мегузарам барои сценарияҳои мураккаб ва файлҳои калон.