Sobes.tech
Middle

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.