我想允许客户端下载包含来自 ResultSet 的数据的 csv 文件。我正在使用 java API (PLAY! 2.1)。
我的解决方案有效,但在 ResultSet 包含大量数据时不可用。
在我的控制器中:
ResultSet rs = st.executeQuery(sql);
String filename = "";
filename = createCSV(rs);.
response().setContentType("text/csv");
response().setHeader("Content-disposition","attachment; filename="+"export.csv");
return ok(new java.io.File("D:\\UTILIS~1\\user\\AppData\\Local\\Temp\\"+filename));
createCSV 方法:
public static String createCSV(ResultSet _resultSet) {
String filename = "";
try{
ResultSetMetaData meta = _resultSet.getMetaData();
// CSV file creation
File tempDir = new File(System.getProperty("java.io.tmpdir"));
System.out.println(System.getProperty("java.io.tmpdir"));
File tempFile = File.createTempFile("test", ".csv", tempDir);
filename = tempFile.getName();
FileWriter fileWriter = new FileWriter(tempFile, true);
System.out.println(tempFile.getAbsolutePath());
BufferedWriter bw = new BufferedWriter(fileWriter);
for(int i = 1; i <= meta.getColumnCount(); i++)
{
String columnLabel = meta.getColumnName(i);
bw.write(columnLabel + "|");
}
bw.write("\r\n");
while(_resultSet.next())
{
for(int i = 1, count = meta.getColumnCount(); i <= count; i++){
if (_resultSet.getObject(i) == null)
bw.write("null|");
else
bw.write(_resultSet.getObject(i).toString() + "|");
}
bw.write("\r\n");
}
bw.close();
tempFile.deleteOnExit();
} catch(Exception e){
e.printStackTrace();
}
return filename;
}
为了节省内存,我如何写入文件并使用流将其发送给用户。
我想我需要使用 Chunks,但我不知道该怎么做。
任何样品,提示?