Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

carregar, ler e salvar informações .csv do cliente

Pessoal boa tarde, estou desenvolvendo uma aplicação utilizando java, spring mvc e finalmente cheguei numa parte nova do meu estudo, o cliente seleciona um arquivo com 3 colunas e eu preciso receber esses dados rodar um regra de negocio e salvar oque for interessante.

Minha dúvida é, qual a melhor prática?

ate ontem estava pesquisando muito e achava q deveria ler tudo no client, depois tentando conseguir o diretório raiz e vi que por segurança não é o caminho, hoje acho que é salvar o arquivo na aplicação, atuar nele e depois deletar, como vcs podem ver estou perdido.

queria muito entender mais sobre isso, se alguém tiver algum código para expor aqui como exemplo eu agradeceria muito.

a parte do HTML esta ok?

                                    <form method="POST" action="${pageContext.request.contextPath}/importando-contatos" enctype="multipart/form-data">
                                        <div class="form-body">
                                            <div class="row p-t-20">
                                                <div class="col-md-6">
                                                    <div class="col-md-12">
                                                        <div class="form-group">
                                                            <label class="control-label">Upload de arquivo</label>
                                                            <input type="file" class="form-control" id="exampleInputFile" aria-describedby="fileHelp" name="arquivo">
                                                            <small class="form-control-feedback"> Carregue o seu arquivo aqui .txt ou .csv </small> 
                                                        </div>
                                                    </div>
                                                    <div class="col-md-12">
                                                        <div class="form-group">
                                                            <label class="control-label">Grupo</label>
                                                            <select class="form-control custom-select" data-placeholder="Choose a Category" tabindex="1" name="grupo">
                                                                <c:forEach items="${grupoList}" var="list">
                                                                    <option value="${list.id}">${list.nome}</option>
                                                                </c:forEach>
                                                            </select>
                                                        </div>
                                                    </div>
                                                </div>
                                                <div class="col-lg-6">
                                                    <h6 class="card-title">Grupos cadastrados</h6>
                                                    <div class="table-responsive">
                                                        <table class="table">
                                                            <tbody>
                                                                <c:forEach items="${grupoList}" var="list">
                                                                    <tr>
                                                                        <td>${list.nome}</td>
                                                                        <td>${list.total} Contatos</td>
                                                                        <td><a href='#' class="text-muted"><i class="fa fa-eye"></i></a></td>
                                                                        <td><a href='#' class="text-muted"><i class="fa fa-pencil"></i></a></td>
                                                                        <td><a href='#' class="text-muted"><i class="fa fa-trash-o"></i></a></td>
                                                                    </tr>
                                                                </c:forEach>
                                                            </tbody>
                                                        </table>
                                                    </div>
                                                </div>
                                            </div>
                                            <!--/row-->
                                        </div>
                                        <div class="form-actions">
                                            <button type="submit" class="btn btn-success"> <i class="fa fa-check"></i> Carregar</button>
                                        </div>
                                    </form>
4 respostas

meu controller eu estou recebendo o file, mas não estou utilizando ele, pq não sei oq fazer na sequencia, mas logo abaixo quando seto o caminho exato do arquivo na minha maquina eu consegui acessar o arquivo, mas eu não sei o caminho dos arquivos do meu cliente.

@RequestMapping(value = "/importando-contatos", method = RequestMethod.POST)
    public String upload(@RequestParam("arquivo") MultipartFile file, HttpServletRequest request, HttpServletResponse response, RedirectAttributes redirectAttributes) throws SQLException {

        try {
            UsuarioDTO usuarioDTO = (UsuarioDTO) request.getSession().getAttribute("logando"); // Recupera parametros da session

            if (EnumStatus.ATIVO.toString().equals(usuarioDTO.getStatsTemp())
                    && EnumDeletado.NAO.toString().equals(usuarioDTO.getDeletadoTemp())) { // Verifica se usuário tem permissões

                GrupoDTO grupoDTO = new GrupoDTO();
                grupoDTO.setConta(usuarioDTO.getConta());
                grupoDTO.setId(Integer.parseInt(request.getParameter("grupo")));

                File arquivoCSV = new File("E:\\testando.txt");
                System.out.println("file : " + arquivoCSV.getAbsoluteFile());
                System.out.println(" path : " + arquivoCSV.getAbsolutePath());

                try {

                    //cria um scanner para ler o arquivo
                    Scanner leitor = new Scanner(arquivoCSV);

                    //variavel que armazenara as linhas do arquivo
                    String linhasDoArquivo = new String();

                    //percorre todo o arquivo
                    while (leitor.hasNext()) {

                        //recebe cada linha do arquivo
                        linhasDoArquivo = leitor.nextLine();

                        //separa os campos entre as virgulas de cada linha
                        String[] valoresEntreVirgulas = linhasDoArquivo.split(";");

                        //imprime a coluna que quiser
                        for (int i = 0; i < valoresEntreVirgulas.length; i++) {
                            System.out.println(valoresEntreVirgulas[i]);
                        }

                    }

                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                }

                return "redirect:importar-contatos";

            } else {
                response.sendRedirect("painel");
            }

        } catch (IOException | NumberFormatException e) {
            e.printStackTrace();
        } finally {

        }
        return null;
    }

Acho que você pode olhar commons csv => https://commons.apache.org/proper/commons-csv/user-guide.html

solução!

Fala Rodrigo, beleza ?

Uma outra coisa que você pode fazer é, ao invés de salvar o arquivo numa pasta para depois carregá-lo com Scanner, utilizar o próprio MultipartFile já trazido pelo Spring. Mais ou menos isso:

@RequestMapping(value="/upload/file", method=RequestMethod.POST)
public String upload(MultipartFile file) {

    InputStream inputStream = file.getInputStream();
    Scanner scanner = new Scanner(inputStream);
        ...
}

E a partir daí ler o arquivo com a classe Scanner normalmente. Aí você analisa os dados e pode salvar outro arquivo, em banco de dados, etc. Onde achar melhor.

PS: Li que você queria pegar o caminho do arquivo na máquina do cliente. Isso não vai rolar! =/ Dentro do server depois de receber o upload não sabemos mais que o nome original do arquivo file.getOriginalFileName(). Não temos como saber detalhes sobre onde o arquivo se encontrava no sistema de arquivos de quem usa a app. E nem deveríamos saber!

Alberto Souza Isso vai me ajudar muito, vlw

Rafael Rollo vlw mesmo, isso ja resolve, pequeno palpite ai ja me ajudou muito.

Muito Obrigado :)