Sobes.tech
Middle

Kā jūs realizētu failu augšupielādi servera lietojumprogrammā?

sobes.tech AI

Atbilde no AI

Failu augšupēšanai es izmantotu MultipartBody no Retrofit bibliotēkas.

  1. API interfeisa sagatavošana: Izveidojam interfeisu ar anotāciju @Multipart un @POST. Metode pieņem @Part failam un citām pieprasījuma daļām, ja tās ir.

    interface FileApi {
        @Multipart
        @POST("/upload")
        suspend fun uploadFile(
            @Part file: MultipartBody.Part,
            @Part("description") description: RequestBody? = null
        ): Response<ResponseBody>
    }
    
  2. MultipartBody.Part izveide: Pārvēršam File vai Uri uz RequestBody, tad uz MultipartBody.Part.

    // Faila gadījumā
    val file = File("ceļš/uz/failu")
    val requestFile = file.asRequestBody("multipart/form-data".toMediaTypeOrNull())
    val filePart = MultipartBody.Part.createFormData("file", file.name, requestFile)
    
    // Uri gadījumā
    val uri = Uri.parse("...") // iegūstam Uri
    val inputStream = context.contentResolver.openInputStream(uri)
    val requestBody = inputStream!!.readBytes().toRequestBody("multipart/form-data".toMediaTypeOrNull(), 0, inputStream.available())
    val filePart = MultipartBody.Part.createFormData("file", "faila_vards", requestBody)
    

    "file" nosaukums createFormData jāatbilst servera prasībām.

  3. Citu daļu RequestBody izveide: Ja nepieciešams sūtīt citus datus (teksts, skaitļi), izmantojiet RequestBody.

    val description = "Faila apraksts".toRequestBody("text/plain".toMediaTypeOrNull())
    
  4. Pieprasījuma izpilde: Izsauciet Retrofit interfeisa metodi, nododot izveidotās daļas.

    // Injektējam vai iegūstam FileApi instanci
    val api: FileApi = ...
    
    // Korutī vai citā asinhronā kontekstā
    try {
        val descriptionPart = "Manu failu".toRequestBody("text/plain".toMediaTypeOrNull())
        val fileToUpload = File("ceļš/uz/failu")
        val requestFile = fileToUpload.asRequestBody("multipart/form-data".toMediaTypeOrNull())
        val filePart = MultipartBody.Part.createFormData("file", fileToUpload.name, requestFile)
    
        val response = api.uploadFile(filePart, descriptionPart)
    
        if (response.isSuccessful) {
            // Fails veiksmīgi augšupielādēts
        } else {
            // Kļūdas apstrāde
        }
    } catch (e: Exception) {
        // Izņēmuma apstrāde
    }
    

Papildu aspekti:

  • Augšupielādes progresu: var ieviest RequestBody ar progresu uzraudzību, lai rādītu augšupielādes indikatoru.
  • Lieli faili: ļoti lieliem failiem apsveriet straumēšanu vai sadalīšanu daļās.
  • Kļūdu apstrāde: pārbaudiet servera atbildes kodus un apstrādājiet tīkla kļūdas.
  • Atļaujas: pārliecinieties, ka lietotnei ir atļauja lasīt failus (READ_EXTERNAL_STORAGE) vecākās Android versijās.
  • ViewModel/Repository: faila augšupielādes loģiku novietojiet repozitorijā vai ViewModel, lai uzlabotu arhitektūru.
  • WorkManager: izmantojiet fonā notiekošai augšupielādei, kas turpinās pat, ja lietotne ir aizvērta.

MultipartBody priekšrocības:

  • Standarta veids failu sūtīšanai ar papildu datiem.
  • Pārklāts ar lielāko daļu servera karkasu.
  • Labs integrācija ar Retrofit.

Tas ir uzticams un plaši izmantots pieejas veids failu augšupielādei Android platformā.