[RESOLVIDO] Trocar charset do conteúdo de um arquivo recebido via upload

Pessoal.

Tenho um endpoint de upload que recebe um MultipartFile.

Resource upload(@PathVariable Integer id, @RequestParam MultipartFile file) throws IOException {

Neste endpoint eu costumo receber arquivos .csv e o que eu faço é acessar o conteúdo e processar cada linha validando as informações para escrever um novo arquivo com o nome correto e jogar em um diretório onde o Apache Camel está mapeado com uma rota.

O problema é que um dos usuários gerou um arquivo .csv, mas abriu em um editor de texto qualquer e salvou por acaso com o encoding UTF-16 LE quando fui processar o arquivo haviam diversos caracteres especiais e tive problemas com o arquivo.

18

Gostaria de saber se há como sempre que receber um MultipartFile eu conseguiria trocar o charset dele antes de processar o arquivo?

Obrigado desde já.

Cara, dá uma olhada nessa thread

@darlan_machado , obrigado pela atenção.

Cara eu cheguei a ver tópicos como esse, nestes exemplos você “sabe” qual é o encoding que está vindo, por exemplo, UTF-16LE e você converte ele para o que você precisa.

Eu queria saber se há algo mais com a possibilidade de receber qualquer encoding e forçar para o encode que eu quero.

Usando o exemplo na thread que você passou eu teria que deixar fixo: “UTF-16LE”.

Você saberia me dizer se há alguma possibilidade de ter algo genérico neste sentido? Eu já procurei bastante e até o momento não encontrei.

@aboult, Vê se esse caso resolve detectar encondig

Para outros que possam vir a ter a mesma necessidade que eu, consegui resolver semana passada.
Basicamente unindo as threads que vocês me enviaram @darlan_machado e @jacoboliveira

Para converter o arquivo no encode que eu quero basicamente eu criei este método:

private static void encodeFileInLatinAlphabet(InputStream source, String fromEncoding, File target) throws IOException {
    try (BufferedReader reader = new BufferedReader(new InputStreamReader(source, fromEncoding));
         BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(target),
                 StandardCharsets.ISO_8859_1))) {
        char[] buffer = new char[16384];
        int read;
        while ((read = reader.read(buffer)) != -1)
            writer.write(buffer, 0, read);
    }
}

No meu caso eu sempre preciso que o arquivo fique em ISO_8859_1, então ele está fixo dentro do método, mas eu poderia também converter para qualquer encode.

E o outro problema era que no meu caso eu posso receber charsets diferentes, pois é um upload de arquivos que vários usuários utilizam, então eu precisava detectar qual é o charset que veio.

encoding = UniversalDetector.detectCharset(file.getInputStream());
if (encoding == null) {
  // throw exception
}

Estou usando essa dependência que trata a maior parte dos charsets (pelo menos os básicos que trabalhamos por aqui), caso ele não encontre eu devolvo uma exceção.

Dessa forma eu consigo pegar o charset do arquivo original e converter para o charset que eu preciso independente do arquivo.

Vlw pela ajuda.

2 curtidas