Sobes.tech
Middle

Kuidas te implementiksite failide üleslaadimise rakenduse kaudu serverisse?

sobes.tech AI

Vastus AI-lt

Sõltuvalt failide suurusest, usaldusväärsuse nõuetest ja serveri võimalustest, saab kasutada mitmeid lähenemisviise:

1. HTTP POST päring koos multipart/form-data-ga:

See on standardne viis failide saatmiseks HTTP kaudu:

// Näide Retrofit ja OkHttp kasutades
interface FileUploadService {
    @Multipart
    @POST("/upload")
    suspend fun uploadFile(
        @Part file: MultipartBody.Part
    ): Response<ResponseBody>
}

// Koodis
val file = File("tee/failini.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)
  • Eelised: Standartne, laialdaselt toetatud meetod.
  • Miinused: Suurte failide puhul võib olla ebaefektiivne, kuna kogu fail laaditakse mällu ning puudub võimalus katkestatud üleslaadimise jätkamiseks.

2. Asünkroonsete üleslaadimiste raamatukogud:

Näiteks OkHttp kasutades, mis võimaldab faile voogedastamise režiimis saata, mis on suuremate failide puhul tõhusam:

// Näide OkHttp kasutades
val client = OkHttpClient()
val file = File("tee/suurele/failile.zip")

val requestBody = file.asRequestBody("application/octet-stream".toMediaTypeOrNull())

val request = Request.Builder()
    .url("http://teie_server/upload")
    .post(requestBody)
    .build()

client.newCall(request).enqueue(object : Callback {
    override fun onFailure(call: Call, e: IOException) {
        // Vea töötlemine
    }

    override fun onResponse(call: Call, response: Response) {
        if (response.isSuccessful) {
            // Edukas üleslaadimine
        } else {
            // Vea töötlemine
        }
    }
})
  • Eelised: Efektiivne suurte failide puhul, voogedastamise režiimis saatmine, suurem paindlikkus.
  • Miinused: Nõuab rohkem koodi progressi ja vigade töötlemiseks.

3. Taustateenused ja taastamise tugi (WorkManager):

Usaldusväärseks taustal üleslaadimiseks, eriti pikaajaliste protsesside või ühenduse katkestuste korral, soovitatakse kasutada WorkManager. See tagab ülesannete täitmise garanteeritult, isegi kui rakendus on suletud või seade taaskäivitub:

Koodinäide:

// Faili üleslaadimise töö taotluse näide
val uploadRequest = OneTimeWorkRequestBuilder<FileUploadWorker>()
    .setInputData(
        workDataOf(
            FileUploadWorker.KEY_FILE_URI to fileUri.toString(),
            FileUploadWorker.KEY_UPLOAD_URL to "http://teie_server/upload"
        )
    )
    .setConstraints(
        Constraints.Builder()
            .setRequiredNetworkType(NetworkType.METERED) // Ainult võrgu olemasolul
            .build()
    )
    .build()

WorkManager.getInstance(context).enqueue(uploadRequest)

// FileUploadWorker näide (täitmine Worker-i sees)
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)

        // Faili üleslaadimise loogika kasutades OkHttp või muud raamatukogu
        // Protsessi ja vigade töötlemine

        return try {
            // Oletame, et funktsioon uploadFileBlockingAsync() teostab üleslaadimise
            uploadFileBlockingAsync(fileUri, uploadUrl)
            Result.success()
        } catch (e: Exception) {
            // Kui tekib viga, WorkManager proovib uuesti
            Result.retry()
        }
    }

    companion object {
        const val KEY_FILE_URI = "file_uri"
        const val KEY_UPLOAD_URL = "upload_url"
    }
}
  • Eelised: Usaldusväärne taustal üleslaadimine, automaatne taastamine, süsteemi ressursside haldamine.
  • Miinused: Nõuab rohkem seadistust ja arusaamist.

Valik sõltub:

  • Faili suurusest: suurte failide puhul eelistatakse voogedastust või WorkManagerit.
  • Usaldusväärsusest: kriitiliste üleslaadimiste puhul on WorkManager parim valik.
  • Taustatöö nõuetest: kasutage WorkManagerit.
  • Süsteemi keerukusest: lihtsad HTTP POST meetodid on väikeste failide puhul lihtsamad.

Täiendavad kaalutlused:

  • Protsessi näitamine: oluline on suurte failide puhul kasutajale näidata üleslaadimise edenemist.
  • Vigade töötlemine: tuleb käsitleda erinevaid vigu, nagu võrgu probleemid, serveri vead ja teised.
  • Turvalisus: veenduge, et üleslaadimine toimub turvalise ühenduse kaudu (HTTPS).
  • Serveri piirangud: arvestage serveri piirangutega failide suuruse ja samaaegsete päringute arvu osas.
  • Autentimine/Autoriseerimine: kui server seda nõuab, lisage see üleslaadimisnõuetesse.

Tavaliselt alustaksin HTTP POST-iga multipart/form-data-st ning liiguksin voogedastuse või WorkManageri kasutamisele suuremate ja keerulisemate stsenaariumide jaoks.