როგორ განახორციელებდით ფაილების ატვირთვას სერვერულ აპლიკაციაში?
sobes.tech AI
პასუხი AI-სგან
ფაილების ატვირთვისთვის მე გამოვიყენებდი MultipartBody-ს Retrofit ბიბლიოთეკიდან.
-
API ინტერფეისის მომზადება: ქმნით ინტერფეისს ანოტაციით
@Multipartდა@POST. მეთოდი იღებს@Part-ს ფაილისთვის და სხვა ნაწილებს, თუ არის.interface FileApi { @Multipart @POST("/upload") suspend fun uploadFile( @Part file: MultipartBody.Part, @Part("description") description: RequestBody? = null ): Response<ResponseBody> } -
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-ში უნდა ემთხვეოდეს სერვერის მოთხოვნას. -
სხვა ნაწილებისთვის RequestBody-ის შექმნა: თუ გსურთ სხვა მონაცემების გაგზავნა (ტექსტი, რიცხვები), გამოიყენეთ
RequestBody.val description = "ფაილის აღწერა".toRequestBody("text/plain".toMediaTypeOrNull()) -
მოთხოვნის შესრულება: გამოიძახეთ 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_STORAGEAndroid-ის ძველი ვერსიებისთვის). - ViewModel/Repository: ფაილის ატვირთვის ლოგიკა განთავსეთ რეპოზიტორიაში ან ViewModel-ში უკეთესი არქიტექტურისთვის.
- WorkManager: გამოიყენეთ ფონზე ატვირთვისთვის, რომელიც უნდა გაგრძელდეს, თუნდაც აპლიკაცია დაიხუროს.
MultipartBody-ის უპირატესობები:
- სტანდარტული მეთოდი ფაილების გაგზავნისთვის დამატებითი მონაცემებით.
- მხარდაჭერილია უმეტეს სერვერულ ფрейმვორკებში.
- კარგად ინტეგრირებულია Retrofit-თან.
ეს საიმედო და ფართოდ გამოყენებადი მიდგომაა Android-ში ფაილების ატვირთვისთვის.