Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Create and download CSV file in a Java servlet

I am working on Java ExtJS application in which I need to create and download a CSV file.

  • On clicking a button I want a CSV file to be downloaded to a client's machine.
  • On buttons listener I am calling a servlet using AJAX. There I am creating a CSV file.

I don't want the CSV file to be saved in the server. I want the file should be created dynamically with a download option. I want the contents of a file to be created as a string and then I will serve the content as file in which it will open as download mode in browser (this I have achieved in other language, but not sure how to achieve it in Java).

Here is my code only to create a CSV file, but I really don't want to create or save CSV file if I can only download the file as 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();
    }
}

Can any one help me on this.

Thanks

like image 257
Gourav Avatar asked Jan 27 '14 10:01

Gourav


2 Answers

I got the solution and I am posting it below.

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());
    }
}

Here we don't need to save / store the file in the server.

Thanks

like image 120
Gourav Avatar answered Sep 19 '22 16:09

Gourav


First of all you need to get the HttpServletResponse object so that you can stream a file into it.

Note : This example is something I Wrote for one of my projects and it works.Works on Java 7.

Assuming you got the HttpServletResponse you can do something like this to stream a file. This way the file will be saved into clients' machine.

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);
        }
}

And the stream method should be like this.

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;
    }
}

What this does is, get an inputstream from your source file and write that stream into the outputstream of the HttpServletResponse. This should work since it works perfectly for me. Hope this helps. Sorry for my bad English.

like image 36
Nithya Avatar answered Sep 20 '22 16:09

Nithya