Sobes.tech
Middle

Como implementaria o carregamento de ficheiros numa aplicação de servidor?

sobes.tech IA

Resposta da IA

Para carregar ficheiros, eu usaria o MultipartBody da biblioteca Retrofit.

  1. Preparar a interface API: Criar uma interface com as anotações @Multipart e @POST. O método aceita @Part para o ficheiro e outras partes da requisição, se existirem.

    interface FileApi {
        @Multipart
        @POST("/upload")
        suspend fun uploadFile(
            @Part file: MultipartBody.Part,
            @Part("description") description: RequestBody? = null
        ): Response<ResponseBody>
    }
    
  2. Criar MultipartBody.Part: Converter File ou Uri em RequestBody, e depois em MultipartBody.Part.

    // Para File
    val file = File("caminho/para/ficheiro")
    val requestFile = file.asRequestBody("multipart/form-data".toMediaTypeOrNull())
    val filePart = MultipartBody.Part.createFormData("file", file.name, requestFile)
    
    // Para Uri
    val uri = Uri.parse("...") // Obter 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", "nome_do_ficheiro", requestBody)
    

    O nome "file" em createFormData deve corresponder ao nome do parâmetro esperado pelo servidor.

  3. Criar RequestBody para outras partes: Se precisar enviar outros dados (texto, números), usar RequestBody.

    val description = "Descrição do ficheiro".toRequestBody("text/plain".toMediaTypeOrNull())
    
  4. Executar a requisição: Chamar o método da interface Retrofit, passando as partes criadas.

    // Injetar ou obter uma instância de FileApi
    val api: FileApi = ...
    
    // Em uma coroutine ou outro contexto assíncrono
    try {
        val descriptionPart = "O meu ficheiro".toRequestBody("text/plain".toMediaTypeOrNull())
        val fileToUpload = File("caminho/para/ficheiro")
        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) {
            // Ficheiro carregado com sucesso
        } else {
            // Lidar com erro
        }
    } catch (e: Exception) {
        // Lidar com exceção
    }
    

Aspectos adicionais:

  • Progresso de carregamento: Pode implementar RequestBody com acompanhamento de progresso para mostrar um indicador de carregamento.
  • Ficheiros grandes: Para ficheiros muito grandes, considere streaming ou divisão em partes.
  • Tratamento de erros: Verifique os códigos de resposta do servidor e trate erros de rede.
  • Permissões: Certifique-se de que a aplicação tem permissão para ler ficheiros (READ_EXTERNAL_STORAGE em versões antigas do Android).
  • ViewModel/Repository: Coloque a lógica de carregamento de ficheiros num repositório ou ViewModel para melhor arquitetura.
  • WorkManager: Use para carregamentos em segundo plano que devam continuar mesmo que a aplicação seja fechada.

Vantagens do MultipartBody:

  • Método padrão para enviar ficheiros com dados adicionais.
  • Compatível com a maioria dos frameworks de servidor.
  • Integra-se bem com Retrofit.

Esta é uma abordagem fiável e amplamente utilizada para carregar ficheiros no Android.