Sobes.tech
Middle

როგორ განახორციელებდით ფაილების ატვირთვას სერვერულ აპლიკაციაში?

sobes.tech AI

პასუხი AI-სგან

ფაილების ატვირთვისთვის მე გამოვიყენებდი MultipartBody-ს Retrofit ბიბლიოთეკიდან.

  1. API ინტერფეისის მომზადება: ქმნით ინტერფეისს ანოტაციით @Multipart და @POST. მეთოდი იღებს @Part-ს ფაილისთვის და სხვა ნაწილებს, თუ არის.

    interface FileApi {
        @Multipart
        @POST("/upload")
        suspend fun uploadFile(
            @Part file: MultipartBody.Part,
            @Part("description") description: RequestBody? = null
        ): Response<ResponseBody>
    }
    
  2. MultipartBody.Part-ის შექმნა: გარდაქმნით File ან Uri-ს RequestBody-ად, შემდეგ კი MultipartBody.Part-ად.

    // File-ისთვის
    val file = File("ფაილის/მგზავრი")
    val requestFile = file.asRequestBody("multipart/form-data".toMediaTypeOrNull())
    val filePart = MultipartBody.Part.createFormData("file", file.name, requestFile)
    
    // Uri-ისთვის
    val uri = Uri.parse("...") // 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", "ფაილის_სახელი", requestBody)
    

    "file"-ის სახელი createFormData-ში უნდა ემთხვეოდეს სერვერის მოთხოვნას.

  3. სხვა ნაწილებისთვის RequestBody-ის შექმნა: თუ გსურთ სხვა მონაცემების გაგზავნა (ტექსტი, რიცხვები), გამოიყენეთ RequestBody.

    val description = "ფაილის აღწერა".toRequestBody("text/plain".toMediaTypeOrNull())
    
  4. მოთხოვნის შესრულება: გამოიძახეთ Retrofit-ის ინტერფეისის მეთოდი, გადასცემთ შექმნილ ნაწილებს.

    // ინტერფეისის ინექცია ან მიღება
    val api: FileApi = ...
    
    // კორუტინაში ან სხვა ასინქრონულ კონტექსტში
    try {
        val descriptionPart = "ჩემი ფაილი".toRequestBody("text/plain".toMediaTypeOrNull())
        val fileToUpload = File("ფაილის/მგზავრი")
        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) {
            // ფაილი წარმატებით აიტვირთა
        } else {
            // შეცდომის დამუშავება
        }
    } catch (e: Exception) {
        // გამონაკლისის დამუშავება
    }
    

დამატებითი ასპექტები:

  • ატვირთვის პროგრესი: შესაძლებელია განახორციელოთ RequestBody-ს პროგრესის მონიტორინგით, რათა აჩვენოთ ატვირთვის ინდიკატორი.
  • დიდი ფაილები: ძალიან დიდი ფაილებისთვის განიხილეთ სტრიმინგი ან ნაწილებად გაყოფა.
  • შეცდომების დამუშავება: გადაამოწმეთ სერვერის პასუხის კოდები და დააფიქსირეთ ქსელის შეცდომები.
  • ნებართვები: დარწმუნდით, რომ აპლიკაციას აქვს ფაილების წაკითხვის ნებართვა (READ_EXTERNAL_STORAGE Android-ის ძველი ვერსიებისთვის).
  • ViewModel/Repository: ფაილის ატვირთვის ლოგიკა განთავსეთ რეპოზიტორიაში ან ViewModel-ში უკეთესი არქიტექტურისთვის.
  • WorkManager: გამოიყენეთ ფონზე ატვირთვისთვის, რომელიც უნდა გაგრძელდეს, თუნდაც აპლიკაცია დაიხუროს.

MultipartBody-ის უპირატესობები:

  • სტანდარტული მეთოდი ფაილების გაგზავნისთვის დამატებითი მონაცემებით.
  • მხარდაჭერილია უმეტეს სერვერულ ფрейმვორკებში.
  • კარგად ინტეგრირებულია Retrofit-თან.

ეს საიმედო და ფართოდ გამოყენებადი მიდგომაა Android-ში ფაილების ატვირთვისთვის.