How would you implement file upload to a server application?
sobes.tech AI
Answer from AI
To upload files, I would use MultipartBody from the Retrofit library.
-
Prepare the API interface: Create an interface with
@Multipartand@POSTannotations. The method accepts@Partfor the file and other parts of the request if any.interface FileApi { @Multipart @POST("/upload") suspend fun uploadFile( @Part file: MultipartBody.Part, @Part("description") description: RequestBody? = null ): Response<ResponseBody> } -
Create MultipartBody.Part: Convert
FileorUritoRequestBody, then toMultipartBody.Part.// For File val file = File("path/to/file") val requestFile = file.asRequestBody("multipart/form-data".toMediaTypeOrNull()) val filePart = MultipartBody.Part.createFormData("file", file.name, requestFile) // For Uri val uri = Uri.parse("...") // Get 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", "filename", requestBody)The name
"file"increateFormDatashould match the parameter name expected by the server. -
Create RequestBody for other parts: If you need to send other data (text, numbers), use
RequestBody.val description = "File description".toRequestBody("text/plain".toMediaTypeOrNull()) -
Execute the request: Call the method from the Retrofit interface, passing the created parts.
// Inject or obtain an instance of FileApi val api: FileApi = ... // In a coroutine or other asynchronous context try { val descriptionPart = "My file".toRequestBody("text/plain".toMediaTypeOrNull()) val fileToUpload = File("path/to/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) { // File uploaded successfully } else { // Handle error } } catch (e: Exception) { // Handle exception }
Additional aspects:
- Upload progress: You can implement a
RequestBodywith progress tracking to show a loading indicator. - Large files: For very large files, consider streaming or breaking into parts.
- Error handling: Check server response codes and handle network errors.
- Permissions: Ensure the app has permission to read files (
READ_EXTERNAL_STORAGEon older Android versions). - ViewModel/Repository: Place the file upload logic in a repository or ViewModel for better architecture.
- WorkManager: Use for background uploads that should continue even if the app is closed.
Advantages of MultipartBody:
- Standard way to send files with additional data.
- Supported by most server frameworks.
- Integrates well with Retrofit.
This is a reliable and widely used approach for uploading files in Android.