2016-09-25 127 views
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 
    ) 

回答

0

你的服務器端代碼應該是這樣的:

@RequestMapping(method = RequestMethod.GET, value = "csv", 
     produces = { AdditionalMediaTypes.TEXT_CSV_UTF8, AdditionalMediaTypes.APPLICATION_CSV_UTF8 }) 
    public void getCsvFile(HttpServletRequest request, HttpServletResponse response) throws Exception { 
    csvWriter.writeCsvToResponse(request, response); 
    } 

當所謂的CSV文件會下載到客戶端。

public void writeCsvToResponse(HttpServletRequest request, 
     HttpServletResponse response) throws IOException { 
    methodToWriteYourThingAsCsv.writeToStream(yourListOfObjectsYouWantToWrite, response.getOutputStream()); 
    } 
+0

可以請你看看我更新的帖子?? –

+0

您不需要在標題中設置任​​何內容。這是我的形式與我下載csv:'

);'你可以先試着看到服務器端正在工作,只需從瀏覽器調用它,它應該立即下載csv,現在它已更新。說你不需要這個的ajax請求 – BadChanneler

+0

我可以使用我在代碼中顯示的ajax請求嗎? –