Sobes.tech
Middle

Kuidas te implementiksite failide üleslaadimise serverirakendusse?

sobes.tech AI

Vastus AI-lt

Failide üleslaadimiseks kasutaksin mahtuvuslikku keha (MultipartBody) Retrofit raamatukogust.

  1. API-liidese ettevalmistamine: Loome liidese anotatsioonidega @Multipart ja @POST. Meetod võtab @Part failile ja teistele osa, kui neid on.

    interface FileApi {
        @Multipart
        @POST("/upload")
        suspend fun uploadFile(
            @Part file: MultipartBody.Part,
            @Part("description") description: RequestBody? = null
        ): Response<ResponseBody>
    }
    
  2. MultipartBody.Part loomine: Muudame File või Uri RequestBody-ks ja seejärel MultipartBody.Part-ks.

    // Faili jaoks
    val file = File("tee/failini")
    val requestFile = file.asRequestBody("multipart/form-data".toMediaTypeOrNull())
    val filePart = MultipartBody.Part.createFormData("file", file.name, requestFile)
    
    // Uri jaoks
    val uri = Uri.parse("...") // saame 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", "faili_nimi", requestBody)
    

    "file" nimi createFormData-s peab vastama serveri ootustele.

  3. Muude osade RequestBody loomine: Kui vaja saata teisi andmeid (tekst, numbrid), kasutage RequestBody.

    val description = "Faili kirjeldus".toRequestBody("text/plain".toMediaTypeOrNull())
    
  4. Päringu täitmine: Kutsuge välja Retrofit liidese meetod, edastades loodud osad.

    // Injekteeri või saa FileApi eksemplar
    val api: FileApi = ...
    
    // Korutinas või muus asünkroonses kontekstis
    try {
        val descriptionPart = "Minu fail".toRequestBody("text/plain".toMediaTypeOrNull())
        val fileToUpload = File("tee/failini")
        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) {
            // Fail on edukalt üles laaditud
        } else {
            // Käsitle viga
        }
    } catch (e: Exception) {
        // Väljaheite käsitlemine
    }
    

Täiendavad aspektid:

  • Üleslaadimise progress: saab rakendada RequestBody koos progressi jälgimisega, et näidata laadimisindikaatorit.
  • Suured failid: kaaluda voogedastust või jagamist osadeks.
  • Vigade käsitlemine: kontrollige serveri vastuse koode ja käsitlege võrguvigu.
  • Luba: veenduge, et rakendil on luba failide lugemiseks (READ_EXTERNAL_STORAGE) vanemates Androidi versioonides.
  • ViewModel/Repository: laadimisloogika asetada repository või ViewModel-isse parema arhitektuuri jaoks.
  • WorkManager: kasutada taustal laadimiseks, mis peab jätkuma isegi kui rakendus on suletud.

MultipartBody eelised:

  • Standardne viis failide saatmiseks koos lisanduvate andmetega.
  • Toetab enamik serveriraamistikke.
  • Hea integreerimine Retrofit-iga.

See on usaldusväärne ja laialdaselt kasutatav lähenemisviis failide üleslaadimiseks Androidis.