Usando Aberto CSV para Enviar arquivos de ServletOutputStream
Pergunta
Eu tenho analisado um Objeto JSON que foi enviada para o meu TOMCAT server usando o POST e transformou-o em um arquivo CSV.Eu gostaria de enviar o arquivo CSV para o usuário.Estou confuso sobre como enviar o arquivo de volta, porque todos os exemplos que tenho visto fazer referência a um ficheiro que é armazenado no servidor - o meu arquivo é criado na memória e, na verdade, não fazer referência a um arquivo/arquivo descritor tanto quanto eu posso dizer.
//The doPost method has already generated the String[] - I then call generateCSV
protected void generateCSV(ArrayList<String[]> data, ServletOutputStream out,
HttpServletResponse response)
{
try{
BufferedWriter buff = new BufferedWriter(new OutputStreamWriter(out));
CSVWriter writer = new CSVWriter(buff);
writer.writeAll(data);
writer.close();
sendFile(response, out);
}catch(IOException | ServletException e){
e.printStackTrace();
}
}
protected void sendFile(HttpServletResponse response, ServletOutputStream outstream)throws ServletException, IOException
{
response.setContentType("application/octet-stream");
outstream.flush();
outstream.close();
}
Solução
O que você tem a fazer para enviar um arquivo para o usuário a partir de um servlet?
- Definir o tipo de conteúdo.
- Escrever bytes.
Parece-me que você está fazendo isso, mas na ordem errada.Também, ao invés de usar o application/octet-stream você pode querer realmente saber o navegador esta é CSV.Você também pode querer dar-lhe um nome de ficheiro.
response.setContentType("text/csv");
response.setHeader("Content-Disposition","filename=whatever.csv");
BufferedWriter buff = new BufferedWriter(new OutputStreamWriter(out));
CSVWriter writer = new CSVWriter(buff);
writer.writeAll(data);
writer.close();