web-dev-qa-db-fra.com

Créer et télécharger un fichier CSV Java (Servlet)

Je travaille sur l'application Java EXTJS dans laquelle j'ai besoin de créer et de télécharger un fichier CSV.

En cliquant sur un bouton, je souhaite qu'un fichier CSV soit téléchargé sur la machine des clients. 

Sur l’écouteur de boutons, j’appelle une servlet en utilisant ajax. Là je crée un fichier CSV.

Je ne veux pas que le fichier CSV soit enregistré sur le serveur. Je veux que le fichier soit créé dynamiquement avec l'option de téléchargement.

Je veux que le contenu d'un fichier soit créé sous forme de chaîne, puis je le servirai sous forme de fichier dans lequel il s'ouvrira en mode de téléchargement dans un navigateur (ceci est possible dans un autre langage, mais je ne suis pas sûr de savoir comment l'obtenir en Java).

Voici mon code uniquement pour créer un fichier CSV, mais je ne souhaite vraiment pas créer ou enregistrer un fichier CSV si je ne peux le télécharger qu'en tant que CSV.

public String createCSV()
{
    try
    {
        String filename = "c:\\test.csv";
        FileWriter fw = new FileWriter(filename);
        fw.append("XXXX");
        fw.append(',');
        fw.append("YYYY");
        fw.append(',');
        fw.append("ZZZZ");
        fw.append(',');
        fw.append("AAAA");
        fw.append(',');
        fw.append("BBBB");
        fw.append('\n');

        CSVResult.close();
        return "Csv file Successfully created";
    }
    catch(Exception e)
    {
        return e.toString();
    }
}

Quelqu'un peut-il m'aider à ce sujet?.

Merci

9
Gourav

J'ai la solution et je la poste ci-dessous.

public void doGet(HttpServletRequest request, HttpServletResponse response)
{
    response.setContentType("text/csv");
    response.setHeader("Content-Disposition", "attachment; filename=\"userDirectory.csv\"");
    try
    {
        OutputStream outputStream = response.getOutputStream();
        String outputResult = "xxxx, yyyy, zzzz, aaaa, bbbb, ccccc, dddd, eeee, ffff, gggg\n";
        outputStream.write(outputResult.getBytes());
        outputStream.flush();
        outputStream.close();
    }
    catch(Exception e)
    {
        System.out.println(e.toString());
    }
}

Ici, nous n’avons pas besoin de sauvegarder/stocker le fichier sur le serveur.

Merci

26
Gourav

Tout d'abord, vous devez obtenir l'objet HttpServletResponse afin de pouvoir y diffuser un fichier. 

Remarque: Cet exemple est quelque chose que j’ai écrit pour l’un de mes projets et qui fonctionne. Fonctionne sur Java 7.

En supposant que vous ayez le HttpServletResponse, vous pouvez faire quelque chose comme ceci pour diffuser un fichier. De cette façon, le fichier sera enregistré dans la machine du client.

public void downloadFile(HttpServletResponse response){ 

        String sourceFile = "c:\\source.csv";
        try {
            FileInputStream inputStream = new FileInputStream(sourceFile);
            String disposition = "attachment; fileName=outputfile.csv";
            response.setContentType("text/csv");
            response.setHeader("Content-Disposition", disposition);
            response.setHeader("content-Length", String.valueOf(stream(inputStream, response.getOutputStream())));

        } catch (IOException e) {
            logger.error("Error occurred while downloading file {}",e);
        }
}

Et la méthode de flux devrait être comme ça. 

private long stream(InputStream input, OutputStream output) throws IOException {

    try (ReadableByteChannel inputChannel = Channels.newChannel(input); WritableByteChannel outputChannel = Channels.newChannel(output)) {
        ByteBuffer buffer = ByteBuffer.allocate(10240);
        long size = 0;

        while (inputChannel.read(buffer) != -1) {
            buffer.flip();
            size += outputChannel.write(buffer);
            buffer.clear();
        }
        return size;
    }
}

Cela permet d'obtenir un flux d'entrée à partir de votre fichier source et d'écrire ce flux dans le flux de sortie de HttpServletResponse. Cela devrait fonctionner puisque cela fonctionne parfaitement pour moi. J'espère que cela t'aides. Désolé pour mon mauvais anglais. 

4
Nithya

Je voudrais ajouter quelque chose à la réponse de Gaurav. J'ai récemment eu à implémenter cette fonctionnalité dans un de mes projets et l'utilisation de javascript était hors de question, car nous devions supporter IE 9. Quel est le problème avec IE 9? ( Exporter au format CSV en utilisant jQuery et html ), voir la deuxième réponse dans le lien. 

J'avais besoin d'un moyen simple de convertir un ResultSet d'une requête de base de données en une chaîne représentant les mêmes données au format CSV. Pour cela, j’ai utilisé http://opencsv.sourceforge.net/ , qui offrait un moyen simple d’obtenir une chaîne du résultat, et le reste correspond à la réponse ci-dessus. 

Les exemples du dossier soruce du projet donnent de bons exemples. 

0
Nitesh Mudireddy