Sobes.tech
Middle

Ako by ste implementovali nahrávanie súborov cez aplikáciu na server?

sobes.tech AI

Odpoveď od AI

Môže sa použiť niekoľko prístupov v závislosti od veľkosti súborov, požiadaviek na spoľahlivosť a možností servera.

1. HTTP POST požiadavka s multipart/form-data:

Toto je štandardný spôsob odosielania súborov cez HTTP.

// Príklad s Retrofit a OkHttp
interface FileUploadService {
    @Multipart
    @POST("/upload")
    suspend fun uploadFile(
        @Part file: MultipartBody.Part
    ): Response<ResponseBody>
}

// V kóde
val file = File("cesta/k/súboru.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)
  • Výhody: Štandardný, široko podporovaný spôsob. Vhodné pre malé a stredné súbory.
  • Nevýhody: Pre veľké súbory môže byť neefektívny, pretože celý súbor musí byť načítaný do pamäte pred odoslaním. Nemá vstavanú podporu pre obnovenie prerušeného nahrávania.

2. Knihy pre asynchrónne nahrávanie:

Existujú knihy, ako je OkHttp, ktoré umožňujú odosielať súbory v prúde, čo je efektívnejšie pre veľké súbory.

// Príklad s OkHttp
val client = OkHttpClient()
val file = File("cesta/k/veľkému/súboru.zip")

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

val request = Request.Builder()
    .url("http://váš_server/upload")
    .post(requestBody)
    .build()

client.newCall(request).enqueue(object : Callback {
    override fun onFailure(call: Call, e: IOException) {
        // Spracovanie chyby
    }

    override fun onResponse(call: Call, response: Response) {
        if (response.isSuccessful) {
            // Úspešné nahranie
        } else {
            // Spracovanie chyby
        }
    }
})
  • Výhody: Efektívne pre veľké súbory, odosielanie v prúde. Väčšia flexibilita.
  • Nevýhody: Vyžaduje viac kódu na sledovanie pokroku a chýb.

3. Služby na pozadí s podporou obnovenia (WorkManager):

Pre spoľahlivé nahrávanie na pozadí, najmä pre dlhé procesy alebo pri prerušení spojenia, sa odporúča použiť WorkManager. Zabezpečuje garantované vykonanie úloh, aj keď je aplikácia zatvorená alebo zariadenie reštartované.

Môžete implementovať úlohu nahrávania súboru v rámci WorkManager. Ak sa nahrávanie prerušilo, WorkManager sa postará o jeho obnovenie.

// Príklad pre Work Request na nahrávanie súboru
val uploadRequest = OneTimeWorkRequestBuilder<FileUploadWorker>()
    .setInputData(
        workDataOf(
            FileUploadWorker.KEY_FILE_URI to fileUri.toString(),
            FileUploadWorker.KEY_UPLOAD_URL to "http://váš_server/upload"
        )
    )
    .setConstraints(
        Constraints.Builder()
            .setRequiredNetworkType(NetworkType.METERED) // Len pri sieti
            .build()
    )
    .build()

WorkManager.getInstance(context).enqueue(uploadRequest)

// Príklad FileUploadWorker (implementácia v rámci 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)

        // Implementácia logiky na nahrávanie súboru s použitím OkHttp alebo inej knižnice
        // Spracovanie pokroku a chýb

        return try {
            // Predpokladáme, že funkcia uploadFileBlockingAsync() vykonáva nahrávanie
            uploadFileBlockingAsync(fileUri, uploadUrl)
            Result.success()
        } catch (e: Exception) {
            // Pri chybe WorkManager sa pokúsi znova
            Result.retry()
        }
    }

    companion object {
        const val KEY_FILE_URI = "file_uri"
        const val KEY_UPLOAD_URL = "upload_url"
    }
}
  • Výhody: Spoľahlivé nahrávanie na pozadí, automatické obnovenie, riadenie systémových zdrojov.
  • Nevýhody: Vyžaduje viac nastavení a pochopenie konceptu WorkManager.

Výber prístupu závisí od:

  • Veľkosti súboru: Pre veľké súbory sú vhodnejšie streamovanie alebo WorkManager.
  • Spoľahlivosti: Pre kritické nahrávania s možnosťou prerušenia je WorkManager najlepšou voľbou.
  • Požiadaviek na pozadinnú prácu: Ak má byť nahrávanie vykonávané na pozadí, použite WorkManager.
  • Zložitosti implementácie: Jednoduché HTTP POST požiadavky sú jednoduchšie na realizáciu pre malé súbory.

Doplňujúce úvahy:

  • Priebeh pokroku: Je dôležité zobrazovať používateľovi priebeh nahrávania, najmä pre veľké súbory.
  • Spracovanie chýb: Je potrebné spracovať rôzne chyby, ako sú problémy s sieťou, chyby servera a iné.
  • Bezpečnosť: Uistite sa, že nahrávanie prebieha cez zabezpečené spojenie (HTTPS).
  • Obmedzenia servera: Zohľadnite obmedzenia vášho servera na veľkosť nahrávaných súborov a počet súčasných požiadaviek.
  • Autentifikácia/Autorizácia: Ak server vyžaduje autentifikáciu, zahrňte ju do požiadaviek na nahrávanie.

Zvyčajne začínam s jednoduchým HTTP POST s multipart/form-data pre jednoduché prípady a prechádzam na streamovanie alebo WorkManager s streamovým spracovaním súborov pre zložitejšie scenáre a veľké súbory.