在 Java servlet 中创建和下载 CSV 文件

2022-09-05 00:15:08

我正在开发Java ExtJS应用程序,我需要在其中创建和下载CSV文件。

  • 单击按钮时,我希望将CSV文件下载到客户端计算机。
  • 在按钮侦听器上,我使用AJAX调用servlet。在那里,我正在创建一个CSV文件。

我不希望将 CSV 文件保存在服务器中。我希望使用下载选项动态创建文件。我希望将文件的内容创建为字符串,然后将内容作为文件提供,它将在浏览器中以下载模式打开(这是我在其他语言中实现的,但不确定如何在Java中实现它)。

这是我的代码,仅用于创建CSV文件,但是如果我只能将文件下载为CSV,我真的不想创建或保存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();
    }
}

任何人都可以帮我这个。

谢谢


答案 1

我得到了解决方案,我在下面发布。

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

在这里,我们不需要将文件保存/存储在服务器中。

谢谢


答案 2

首先,您需要获取 HttpServletResponse 对象,以便可以将文件流式传输到其中。

注意:这个例子是我为我的一个项目写的,它的工作原理。适用于 Java 7。

假设你得到了HttpServletResponse,你可以做这样的事情来流式传输文件。这样,文件将被保存到客户端计算机中。

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

流方法应该是这样的。

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

这样做的目的是,从源文件中获取输入流,并将该流写入 HttpServletResponse 的输出流中。这应该有效,因为它非常适合我。希望这有帮助。对不起,我的英语不好。