Kā jūs realizētu failu augšupielādi caur lietotni uz servera?
sobes.tech AI
Atbilde no AI
Atkarībā no faila izmēra, uzticamības prasībām un servera iespējām var izmantot vairākas pieejas:
1. HTTP POST pieprasījums ar multipart/form-data:
Tas ir standarta veids, kā sūtīt failus caur HTTP:
// Piemērs, izmantojot Retrofit un OkHttp
interface FileUploadService {
@Multipart
@POST("/upload")
suspend fun uploadFile(
@Part file: MultipartBody.Part
): Response<ResponseBody>
}
// Kods
val file = File("ceļš/līdz/failam.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)
- Priekšrocības: Standarta, plaši atbalstīts veids.
- Trūkumi: Lielākiem failiem tas var būt neefektīvs, jo viss fails tiek ielādēts atmiņā, arī nav iespējas atsākt pārtraukto sūtījumu.
2. Asinhronās sūtīšanas bibliotēkas:
Piemēram, izmantojot OkHttp, kas ļauj sūtīt failus plūsmā, kas ir efektīvāk lieliem failiem:
// Piemērs ar OkHttp
val client = OkHttpClient()
val file = File("ceļš/līdz/lielajam/failam.zip")
val requestBody = file.asRequestBody("application/octet-stream".toMediaTypeOrNull())
val request = Request.Builder()
.url("http://jūsu_serveris/upload")
.post(requestBody)
.build()
client.newCall(request).enqueue(object : Callback {
override fun onFailure(call: Call, e: IOException) {
// Sadalīšanas kļūdas apstrāde
}
override fun onResponse(call: Call, response: Response) {
if (response.isSuccessful) {
// Veiksmīga sūtīšana
} else {
// Kļūdas apstrāde
}
}
})
- Priekšrocības: Efektīvi lieliem failiem, plūsmas režīmā sūtīšana, lielāka elastība.
- Trūkumi: Prasa vairāk koda progresam un kļūdu apstrādei.
3. Fona pakalpojumi ar atsākšanas iespēju (WorkManager):
Lai nodrošinātu uzticamu fonu sūtīšanu, īpaši ilgstošiem procesiem vai pārtraucot savienojumu, ieteicams izmantot WorkManager. Tas nodrošina uzdevumu izpildi garantēti, pat ja lietotne ir aizvērta vai ierīce tiek pārstartēta:
Koda piemērs:
// Faila sūtīšanas darba pieprasījuma piemērs
val uploadRequest = OneTimeWorkRequestBuilder<FileUploadWorker>()
.setInputData(
workDataOf(
FileUploadWorker.KEY_FILE_URI to fileUri.toString(),
FileUploadWorker.KEY_UPLOAD_URL to "http://jūsu_serveris/upload"
)
)
.setConstraints(
Constraints.Builder()
.setRequiredNetworkType(NetworkType.METERED) // Tikai ar tīkla pieejamību
.build()
)
.build()
WorkManager.getInstance(context).enqueue(uploadRequest)
// FileUploadWorker piemērs (realizācija Worker iekšienē)
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)
// Faila sūtīšanas loģikas realizācija
// Progresu un kļūdu apstrāde
return try {
// pieņemot, ka funkcija uploadFileBlockingAsync() veic sūtīšanu
uploadFileBlockingAsync(fileUri, uploadUrl)
Result.success()
} catch (e: Exception) {
// Ja rodas kļūda, WorkManager mēģinās atkārtoti
Result.retry()
}
}
companion object {
const val KEY_FILE_URI = "file_uri"
const val KEY_UPLOAD_URL = "upload_url"
}
}
- Priekšrocības: Uzticama fonu sūtīšana, automātiska atsākšana, sistēmas resursu pārvaldība.
- Trūkumi: Prasa vairāk konfigurācijas un izpratnes.
Izvēle ir atkarīga no:
- Faila izmēra: lieliem failiem ir ieteicams izmantot plūsmu vai WorkManager.
- Uzticamības: svarīgiem sūtījumiem vislabāk ir izmantot WorkManager.
- Fona darba prasībām: izmantojiet WorkManager.
- Realizācijas sarežģītības: vienkārši HTTP POST ir vieglāk īstenojams mazākiem failiem.
Papildu apsvērumi:
- Progresu rādīšana: ir svarīgi parādīt lietotājam sūtīšanas progresu, īpaši lieliem failiem.
- Kļūdu apstrāde: ir jāapstrādā dažādas kļūdas, piemēram, tīkla problēmas, servera kļūdas un citas.
- Drošība: pārliecinieties, ka sūtīšana notiek drošā savienojumā (HTTPS).
- Servera ierobežojumi: ņemiet vērā servera ierobežojumus attiecībā uz failu lielumu un vienlaicīgiem pieprasījumiem.
- Autentifikācija/Autorizācija: ja serveris to pieprasa, iekļaujiet to sūtījumos.
Parasti es sāku ar HTTP POST, kas izmanto multipart/form-data, un pāreju uz plūsmu vai WorkManager, ja ir nepieciešams sarežģītākas scenāriji un lielāki faili.