0
我正在向端點發出一個ajax請求,以便從ResultSet
製作CSV
文件。我正在做下面的代碼來做到這一點。如何將CSV文件作爲來自Java中ResultSet的流?
val statement = dbCon.createStatement()
val rs = statement.executeQuery(exportQuery)
val csvWriter = new PrintWriter(new File("D:\\wdd.csv"))
val meta: ResultSetMetaData = rs.getMetaData()
val numberOfColumns = meta.getColumnCount()
var dataHeaders = "\"" + meta.getColumnLabel(1) + "\""
for (i <- 2 to numberOfColumns) {
dataHeaders += ",\"" + meta.getColumnLabel(i) + "\""
}
csvWriter.println(dataHeaders)
while (rs.next()) {
var row = "\"" + rs.getString(1) + "\""
for (i <- 2 to numberOfColumns) {
row += ",\"" + rs.getString(i) + "\""
}
csvWriter.println(row)
}
csvWriter.close()
但問題是,它實際上是寫入服務器端的文件。我不希望它在服務器端寫入文件,而是我想要的是當客戶端啓動此端點時,該文件將自動下載到客戶端。 這是我的Ajax請求。
exportDataAsCSVFile: function (schemaName, params) {
var deferred = can.Deferred();
$.ajax({
url: '/adhoc-matching/export-csv/' + schemaName,
type: 'POST',
contentType: "application/json",
dataType: 'json',
async: true,
data: JSON.stringify(params),
success: function (data) {
deferred.resolve(data);
},
error: function (xhr, settings, exception) {
deferred.reject(xhr, settings, exception);
}
});
return deferred.promise();
}
我怎樣才能讓CSV在內存中流和數據流發送到客戶端自動下載的文件?
我正在使用斯卡拉好(寫(resp))發送響應。 需要更改哪些請求標頭才能發送流?
編輯:
我可以使流成字符串。但是,我應該寫在ajax請求下載文件在客戶端。我曾嘗試將dataType設置爲「text/csv」或「text」,並在頭部下方添加。
$.ajax({
headers: {
Accept : "text/csv; charset=utf-8",
"Content-Type": "text/csv; charset=utf-8"
}
但是該文件沒有在客戶端下載,儘管響應有文本。 下面是我嘗試了,使CSV:
val csvWriter: StringWriter = new StringWriter
try {
val statement = dbCon.createStatement()
val rs = statement.executeQuery(exportQuery)
val meta: ResultSetMetaData = rs.getMetaData()
val numberOfColumns = meta.getColumnCount()
var dataHeaders = "\"" + meta.getColumnLabel(1) + "\""
for (i <- 2 to numberOfColumns) {
dataHeaders += ",\"" + meta.getColumnLabel(i) + "\""
}
csvWriter.write(dataHeaders + "\n")
while (rs.next()) {
var row = "\"" + rs.getString(1) + "\""
for (i <- 2 to numberOfColumns) {
row += ",\"" + rs.getString(i) + "\""
}
csvWriter.write(row + "\n")
//csvWriter.println(row)
}
csvWriter.flush()
}
catch {
case e: Exception =>
}
finally {
dbCon.close()
csvWriter.close()
}
val fileName = "untitled.csv"
val csvData = csvWriter.toString
Ok(csvData).as("text/csv; charset=utf-8").withHeaders(
CONTENT_DISPOSITION -> s"attachment; filename=$fileName",
CONTENT_LENGTH -> csvData.length.toString
)
可以請你看看我更新的帖子?? –
您不需要在標題中設置任何內容。這是我的形式與我下載csv:'
);'你可以先試着看到服務器端正在工作,只需從瀏覽器調用它,它應該立即下載csv,現在它已更新。說你不需要這個的ajax請求 – BadChanneler我可以使用我在代碼中顯示的ajax請求嗎? –